C语言蛇梯棋开发:解决up[][]与down[][]数组元素重复问题
解决蛇梯棋中梯子与蛇位置重复的问题
你的核心问题是当前的重复检查逻辑存在漏洞,导致无法彻底排查up和down数组间的元素重复。以下是问题分析和修正方案:
原代码的问题点
- 数组填充逻辑错误:原代码中
check_up和check_down共用同一个h变量递增索引,导致两个数组的元素被填充到混乱的位置(比如check_up用了偶数索引,check_down用了奇数索引),大量索引为未初始化的垃圾值,无法正确完成重复比对。 - 循环逻辑漏洞:发现重复后重新生成数组,但仅重置
k和counter,没有重新完整遍历所有元素对,可能遗漏新生成数组中的重复项。 - 检查范围不完整:仅针对
check_up[k]和check_down[j]做比对,没有覆盖所有元素组合,存在漏检可能。
修正后的检查逻辑
我们可以用一个更直接的方式:持续检查两个数组的所有元素对,直到没有任何重复为止。
完整修正代码
#include <stdio.h> #include <stdbool.h> // 辅助函数:检查up数组所有元素与down数组所有元素是否存在重复 bool hasDuplicate(int up[][2], int down[][2]) { // 遍历up的全部6个元素(3行×2列) for (int i = 0; i < 6; i++) { int up_val = up[i / 2][i % 2]; // 遍历down的全部6个元素 for (int j = 0; j < 6; j++) { int down_val = down[j / 2][j % 2]; if (up_val == down_val) { return true; // 找到重复项 } } } return false; // 无重复 } void check(int up[][2], int down[][2]) { // 循环检查,直到生成无重复的数组组合 while (hasDuplicate(up, down)) { up_num(up); down_num(down); } // 输出最终的梯子与蛇数组 printf("\n梯子数组(触发位置, 目标位置):\n"); for (int i = 0; i < 3; i++) { printf("%d, %d\n", up[i][0], up[i][1]); } printf("\n蛇数组(触发位置, 目标位置):\n"); for (int i = 0; i < 3; i++) { printf("%d, %d\n", down[i][0], down[i][1]); } }
逻辑说明
- 辅助函数
hasDuplicate:通过遍历两个数组的所有元素组合,确保没有任何值重复。这里用i/2和i%2把一维的遍历索引转换成二维数组的行列索引,简化代码。 - 循环检查机制:用
while循环持续调用up_num和down_num生成新数组,直到hasDuplicate返回false(即无重复),彻底解决重复问题。 - 清晰的输出:标注每个数组的含义,方便调试和验证。
内容的提问来源于stack exchange,提问作者Fruitpunchsamurai
相关产品推荐
相关产品推荐

