//功能:能够判断数独是否可解
//操作实现:若可解,则返回值为1;否则返回0
//这是代码的部分,是一个判断是否可解的函数,x数组用来读入数独题目
//halfright是一个判断数独已填部分是否已经出现错误的函数,right是一个判断是否填完并最终正确的函数
//按这个代码无法完成最终求解,解一半就停了,我不知道为什么。
图二和图四分别是图一和图三的解,但是都没有解完
以下是我写的代码,求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;
}
}
}