今天调试代码时遇到了个诡异事件
代码是关于一个简单的回溯法问题
在3*3方阵中填入1到10内某9个整数,每方格填一个,使所有相邻两个方格两个整数之和为质数,输出满足要求的情况总数
写完后我尝试输出了所有可能的情况,128这个结果是对的,问题出在每个二维数组都是未被赋值的状态。
这是我心想可能是我赋值语句写的有问题,于是就试着下断点单步调试
如图res使用来储存所有结果的数组,board是当前棋盘的状态,col>2是递归结束的条件,依次把所有结果push入res,在push后我加入了一个console并下了断点想看看每次push前board是否像输出的结果那样全是0。
第一次输出,可以看到board此时并不全是0:
第二次输出,依旧没问题:
于是我心想可能刚才是意外,这次输出应该可以正常输出了,于是取消了断点
问题又来了,除了我单步调试输出的那两次,其余的输出依旧变为了全0:
在最后输出res时,前两个也变成了全0:
这就好像这个程序需要我盯着似的,如果不是我单步调试它就不正常输出。实在想不明白是哪里出了问题,下面贴上代码,还请知道原因的大神 指点一下:
let judge=(row, col, num,used,board)=>{
let primeArray = [3, 5, 7, 11, 13, 17,19]
let sum
if (used.indexOf(num) > -1) return false
if (row > 0) {
sum = num + board[row - 1][col]
if (!(primeArray.indexOf(sum) > -1)){return false}
}
if (col>0){
sum=num+board[row][col-1]
if(!(primeArray.indexOf(sum)>-1)){return false}
}
return true
}
let solve=()=>{
let res=[]
let used=[]
let trueBoard=[[0,0,0],[0,0,0],[0,0,0]]
let putNumber=(row,col,board)=>{
if(col>2){
res.push(board) //**************问题出现在这里*****************
console.log(board)
return
}
for(let i=1;i<11;i++){
if(judge(row,col,i,used,board)){
used.push(i)
board[row][col]=i
if(row!=2){
putNumber(row+1,col,board)
}
else {
putNumber(0,col+1,board)
}
board[row][col]=0
used.pop()
}
}
}
putNumber(0,0,trueBoard)
return res
}
console.log(solve())