斩影JACK 2021-12-24 10:13 采纳率: 50%
浏览 106
已结题

C语言实现数独 求debug

//功能:能够判断数独是否可解
//操作实现:若可解,则返回值为1;否则返回0
//这是代码的部分,是一个判断是否可解的函数,x数组用来读入数独题目
//halfright是一个判断数独已填部分是否已经出现错误的函数,right是一个判断是否填完并最终正确的函数

//按这个代码无法完成最终求解,解一半就停了,我不知道为什么。

img

img

img

img


图二和图四分别是图一和图三的解,但是都没有解完
以下是我写的代码,求debug

int available() {
int flag = 0;
int i, j, k, p, l;
int temp;
int z[N * N][2] = {0};//用来记录未填的位置
int w[N * N][N] = {0};//记录位置上已经试过的数
int len[N * N] = {0}; //记录位置上已经试过的数的个数
for (i = 0, k = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (!x[i][j]) {
z[k][0] = i;
z[k][1] = j;
k++;
}
}
}
for (l = 0; l >= 0 && l < k; l++) {
flag = 0;
for (p = 1; p <= N; p++) {
for (i = 0; i < len[l]; i++) {
if (p == w[l][i]) {
break;
}
}
if (i == len[l]) {
temp = x[z[l][0]][z[l][1]];
x[z[l][0]][z[l][1]] = p;
if (halfright()) {
w[l][len[l]] = p;
len[l]++;
flag = 1;
break;
} else x[z[l][0]][z[l][1]] = temp;
}
}
if (!flag) {
l -= 2;
}
}
if (l != k) {
return 0;
} else {
if (!right()) {
return 0;
} else {
printf("\n此数独有解,一组解为:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", x[i][j]);
}
printf("\n");
}
printf("\n");
return 1;
}
}
}

  • 写回答

2条回答 默认 最新

  • 关注

    当if (!flag) flag为0 ,l要退回到上一个位置时,当前w[l]记录位置上已经试过的数和len[j]记录位置上已经试过的数的个数还有x[z[l][0]][z[l][1]]都应该清0吧

            if (!flag)
            {
                for (i = 0; i < N; i++)
                    w[l][i] = 0;
                len[l] = 0;
                x[z[l][0]][z[l][1]] = 0;
                l -= 2;
            }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月4日
  • 已采纳回答 12月27日
  • 请提交代码 12月24日
  • 创建了问题 12月24日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行