我正在制作一个解决3*3 sudoku的脚本。这将是一个可行的答案:
123 312
231 123
312 231
作为输入,我会给出一个3*3 sudoku,其中零是空白点。这个可以工作: 023 230 310
作为输出,我将得到: 123 231 312
然而,我的脚本不起作用。我的输入名为sq,它有一个名为findZero的函数,用于搜索一个零,我有一个名为fill的函数,它删除了一个工作号码的零,我有一个名为checkRC (复选行列)的函数,用于扫描工作号码。
这将是一个递归脚本。
但是,通过这个脚本,我将得到给定的输入:
[0, 2, 3],
[2, 3, 0],
[3, 1, 0]
这一产出:
[1, 2, 3],
[2, 3, 0],
[3, 1, 0],
所以它只改变了一次,然后停止了,我想。我不知道怎么修理这个!
这是我的密码:
var sq = [
[0, 2, 3],
[2, 3, 0],
[3, 1, 0]
];
var x;
var y;
function findZero(square) {
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (square[i][j] === 0) {
x = i;
y = j;
return [x, y];
}
}
}
return [-1, -1];
}
function fill(square) {
if (findZero(square)[0] == -1) {
return square; }
else {
for (var w = 1; w < 4; w++) {
if(checkRC(square,x,y,w) === true){
square[x][y] = w;
return square;
}
}
}
}
var bool = true
function checkRC(square, x, y, w) {
for (var k = 0; k < 3&&bool; k++) {
if (square[x][k] == w || square[k][y] == w) {
bool = false;
return bool;
}
else{
bool = true;
return bool;
}
}
}
console.log(fill(sq));
如果你发现一个小提琴链接更容易:
http://jsfiddle.net/akqn7/
提前感谢!
发布于 2014-02-03 18:34:32
因此,首先,您从未在递归中调用您的函数!
function fill(square) {
if (findZero(square) === null) {
return square;
} else {
for (var w = 1; w < 4; w++) {
if (checkRC(square, x, y, w) === true) {
square[x][y] = w;
return fill(square);
}
}
}
}
看看我是如何放置返回fill()的;这就是递归需要的地方
您的函数checkRC也错了,下面是修正后的版本:
function checkRC(square, x, y, w) {
var bool = true;
for (var k = 0; k < 3 && bool; k++) {
if (square[x][k] == w || square[k][y] == w) {
bool = false;
break;
}
}
return bool;
}
我把bool放在函数中,不直接返回结果,因为如果第一个数字是假的,它就会停止。
参见此小提琴
https://stackoverflow.com/questions/21534456
复制相似问题