You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言蛇梯棋开发:解决up[][]与down[][]数组元素重复问题

解决蛇梯棋中梯子与蛇位置重复的问题

你的核心问题是当前的重复检查逻辑存在漏洞,导致无法彻底排查up和down数组间的元素重复。以下是问题分析和修正方案:

原代码的问题点

  1. 数组填充逻辑错误:原代码中check_up和check_down共用同一个h变量递增索引,导致两个数组的元素被填充到混乱的位置(比如check_up用了偶数索引,check_down用了奇数索引),大量索引为未初始化的垃圾值,无法正确完成重复比对。
  2. 循环逻辑漏洞:发现重复后重新生成数组,但仅重置k和counter,没有重新完整遍历所有元素对,可能遗漏新生成数组中的重复项。
  3. 检查范围不完整:仅针对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]);
    }
}

逻辑说明

  1. 辅助函数hasDuplicate:通过遍历两个数组的所有元素组合,确保没有任何值重复。这里用i/2和i%2把一维的遍历索引转换成二维数组的行列索引,简化代码。
  2. 循环检查机制:用while循环持续调用up_num和down_num生成新数组,直到hasDuplicate返回false(即无重复),彻底解决重复问题。
  3. 清晰的输出:标注每个数组的含义,方便调试和验证。

内容的提问来源于stack exchange,提问作者Fruitpunchsamurai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:16:01