我写了一个javascript程序来解决数独。它似乎工作,但它突然停止。 Console shows that it is working but suddenly stops for no reason
这是原因吗? :(Timeline)我是javascript的新手,我该怎么做才能修复它?
我该如何解决这个问题?谢谢!
以下是代码:
<html>
<head>
</head>
<body>
<script>
var game = [
[0, 0, 9, 0, 5, 7, 0, 6, 0],
[0, 7, 0, 6, 0, 0, 0, 0, 0],
[8, 0, 0, 0, 1, 0, 7, 5, 0],
[0, 0, 0, 3, 6, 0, 1, 7, 2],
[4, 1, 2, 0, 0, 0, 6, 9, 3],
[6, 3, 7, 0, 2, 9, 0, 0, 0],
[0, 4, 1, 0, 5, 0, 0, 0, 7],
[0, 0, 0, 0, 0, 3, 0, 8, 0],
[0, 5, 0, 2, 9, 0, 4, 0, 0]
];
function solve(x, y, g) {
var nextx;
var nexty = y;
if (x < 9 || y < 9) {
if (g[x][y] == 0) {
for (i = 1; i < 10; i++) {
g[x][y] = i;
if (check(x, y, i, g) == true) {
if (x < 8) {
nextx = x + 1;
} else {
nexty = y + 1;
nextx = 0;
}
console.log(x + ' ' + y + ' ' + i + ' ' + g[x][y]);
solve(nextx, nexty, g);
} else {
if (x != 0 && y != 0) {
return;
}
}
}
} else {
if (x < 8) {
nextx = x + 1;
} else {
nexty = y + 1;
nextx = 0;
}
console.log(x + ' ' + y + ' ' + 'b' + ' ' + g[x][y]);
solve(nextx, nexty, g);
return;
}
} else {
if (checkall(g) == true) {
for (var i = 0; i < 9; i++) {
document.write(g[i] + '</br>');
};
} else {
document.write("can't solve");
}
}
}
function check(x, y, i, g) {
var tempx = 0;
var tempy = 0;
var tempb = 0;
var a, b;
for (j = 0; j < 9; j++) {
if (g[x][j] == i) {
tempx = tempx + 1;
}
if (g[j][y] == i) {
tempy = tempy + 1;
}
}
if (x < 3) {
a = 0;
}
if (x < 6) {
a = 3;
}
if (x < 9) {
a = 6;
}
if (y < 3) {
b = 0;
}
if (y < 6) {
b = 3;
}
if (y < 9) {
b = 6;
}
for (c = a; c < a + 3; c++) {
for (d = b; d < b + 3; d++) {
if (g[a][b] == i) {
tempb = tempb + 1;
}
}
}
if (tempx > 1 || tempy > 1 || tempb > 1) {
return false;
} else {
return true;
}
}
function checkall(g) {
var temp1 = 0;
var temp2 = 0;
for (var i = 0; i < 10; i++) {
for (var x = 0; x < 9; x++) {
for (var y = 0; y < 9; y++) {
if (g[x][y] == i) {
temp1 = temp1 + 1;
}
if (g[y][x] == i) {
temp2 = temp2 + 1;
}
};
if (temp1 > 1 || temp2 > 1) {
return false;
} else {
temp1 = 0;
temp2 = 0;
}
}
}
return true
}
solve(0, 0, game);
</script>
</div>
</body>
</html>
答案 0 :(得分:0)
确保检查函数返回的响应:
var div = document.getElementById('output');
将失败并且div将被定义为&#39;未定义&#39;因为您的示例中没有使用&#39;输出&#39;标识。
如果将try / catch子句添加到函数中,您将看到报告的错误。
我可以看到你实际上并没有使用&#39; div&#39;在你的代码中。
我刚刚修改了您的代码,因为我在运行时没有遇到任何错误:
<html>
<body>
<script>
var game = [
[0, 0, 9, 0, 5, 7, 0, 6, 0],
[0, 7, 0, 6, 0, 0, 0, 0, 0],
[8, 0, 0, 0, 1, 0, 7, 5, 0],
[0, 0, 0, 3, 6, 0, 1, 7, 2],
[4, 1, 2, 0, 0, 0, 6, 9, 3],
[6, 3, 7, 0, 2, 9, 0, 0, 0],
[0, 4, 1, 0, 5, 0, 0, 0, 7],
[0, 0, 0, 0, 0, 3, 0, 8, 0],
[0, 5, 0, 2, 9, 0, 4, 0, 0]
];
var intNestedCalls = 0;
function solve(x, y, g) {
var nextx;
var nexty = y;
intNestedCalls++; //Count numer of nested calls
if (x < 9 || y < 9) {
if (g[x][y] == 0) {
for (i = 1; i < 10; i++) {
g[x][y] = i;
if (check(x, y, i, g) == true) {
if (x < 8) {
nextx = x + 1;
} else {
nexty = y + 1;
nextx = 0;
}
console.log(x + ' ' + y + ' ' + i + ' ' + g[x][y]);
solve(nextx, nexty, g);
} else {
if (x != 0 && y != 0) {
//Break here so we drop out and exit the function
break;
}
}
}
} else {
if (x < 8) {
nextx = x + 1;
} else {
nexty = y + 1;
nextx = 0;
}
console.log(x + ' ' + y + ' ' + 'b' + ' ' + g[x][y]);
solve(nextx, nexty, g);
//No need to return here, fall through and exit normally
// return;
}
} else {
if (checkall(g) == true) {
for (var i = 0; i < 9; i++) {
document.write(g[i] + '</br>');
};
} else {
document.write("can't solve");
}
}
intNestedCalls--; //Update nested call counter
}
function check(x, y, i, g) {
var tempx = 0;
var tempy = 0;
var tempb = 0;
var a, b;
for (j = 0; j < 9; j++) {
if (g[x][j] == i) {
tempx = tempx + 1;
}
if (g[j][y] == i) {
tempy = tempy + 1;
}
}
if (x < 3) {
a = 0;
}
if (x < 6) {
a = 3;
}
if (x < 9) {
a = 6;
}
if (y < 3) {
b = 0;
}
if (y < 6) {
b = 3;
}
if (y < 9) {
b = 6;
}
for (c = a; c < a + 3; c++) {
for (d = b; d < b + 3; d++) {
if (g[a][b] == i) {
tempb = tempb + 1;
}
}
}
if (tempx > 1 || tempy > 1 || tempb > 1) {
return false;
} else {
return true;
}
}
function checkall(g) {
var temp1 = 0;
var temp2 = 0;
for (var i = 0; i < 10; i++) {
for (var x = 0; x < 9; x++) {
for (var y = 0; y < 9; y++) {
if (g[x][y] == i) {
temp1 = temp1 + 1;
}
if (g[y][x] == i) {
temp2 = temp2 + 1;
}
};
if (temp1 > 1 || temp2 > 1) {
return false;
} else {
temp1 = 0;
temp2 = 0;
}
}
}
return true;
}
solve(0, 0, game);
alert("Complete!");
</script>
</div>
</body>
</html>
除了完整之外,我什么都看不到输出!在短时间内提醒。
逻辑永远不会到达你的'document.write&#39;指令因为x和y,如果x AND y是&gt; = 9,那么你的逻辑只会到达写语句。
你的考试应该是:
if ( x < 9 && y < 9 ) {
答案 1 :(得分:0)
这是我第一次在此站点上发表评论,但是可以在js中运行强力数独求解器,因为没有1e50可能的排列,因为其中包括每个数字都可能为1的情况。实际上,对于a的解决方案为6670903751057913937920数独。这个数字小了1e27倍。但是运行蛮力的程序甚至无法运行到接近这个数字。相反,由于给定的值,它通常会在您解决数独之前将其最多运行10000次。这是我编写的代码,之所以停止,是因为您插入的数独提示没有解决方案。
border-radius