我正在尝试初始化由单元格组成的多数组数独[9] [9]
当我运行sudoku.initialize()时,* sudoku [x] [y] * s中的所有行,列,框均为8,8,9。
var cell = {
sol: 0,
row: 0,
col: 0,
box: 0,
candi: [1, 2, 3, 4, 5, 6, 7, 8, 9]
};
var sudoku = {}
sudoku = new Array(9);
for (var i = 0; i < 9; i++) {
sudoku[i] = new Array(9);
}
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j] = cell;
}
}
sudoku.initialize = function () {
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j].row = i;
sudoku[i][j].col = j;
if (i < 3) {
if (j < 3)
sudoku[i][j].box = 1;
else if (2 < j && j < 6)
sudoku[i][j].box = 2;
else if (5 < j)
sudoku[i][j].box = 3;
}
else if (2 < i && i < 6) {
if (j < 3)
sudoku[i][j].box = 4;
else if (2 < j && j < 6)
sudoku[i][j].box = 5;
else if (5 < j)
sudoku[i][j].box = 6;
}
else if (5 < i)
if (j < 3)
sudoku[i][j].box = 7;
else if (2 < j && j < 6)
sudoku[i][j].box = 8;
else if (5 < j)
sudoku[i][j].box = 9;
}
}
}
sudoku.print=function(){
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
document.write(sudoku[i][j].col + " ");
}
document.write("\n");
}
}
sudoku.initialize();`
我猜对javascript中的多维数组有误解。
sudoku[2][2].box=1
1
sudoku[4][8].box=2
2
sudoku[2][2].box
2
sudoku[3][3].box
2
因为我是javascript的初学者,所以这段代码可能很荒谬。但无论如何,您都能明白我的意思。
最佳答案
多维数组中的所有81个项目都指向同一个对象,因此:
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j] = cell;
}
}
您使
sudoku[i][j]
存储对同一对象cell
的引用。当您以后尝试修改/访问
sudoku[2][2]
,sudoku[3][3]
,sudoku[4][8]
中的值时,实际上是在使用同一对象。您需要为每个单元格创建一个新对象。
通过这种方式更改代码应该会有所帮助:
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
sudoku[i][j] = {
sol: 0,
row: 0,
col: 0,
box: 0,
candi: [1, 2, 3, 4, 5, 6, 7, 8, 9]
};
}
}
您的
if
方法中也不需要太多的initialize
。一些数学运算和整数除法/模数可以在两行代码中完成所有工作;)
function Cell(row, col)
{
this.col = col;
this.row = row;
this.sol = 0;
this.box = Math.ceil(row / 3) * 3 + Math.ceil(col / 3) - 3;
this.candidates = [1, 2, 3, 4, 5, 6, 7, 8, 9];
}
function Sudoku()
{
this.rows = new Array(9);
for (var i = 0; i < 9; i++)
{
this.rows[i] = new Array(9);
for (var j = 0; j < 9; j++) {
this.rows[i][j] = new Cell(i, j);
}
}
this.print = function() {
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
document.write(this.rows[i][j].row + "/" + this.rows[i][j].col + " ");
}
document.write("<br/>");
}
};
}
var sudoku = new Sudoku();
sudoku.print();