最近看到老婆天天在手机上玩数独。突然想起N年前在用LeetCode的时候,有一道类似的算法题(37.SolvingSudoku)。是否可以使用此算法可视化。照做吧,经过一个小时的练习,最终效果如下:如何解数独在解数独之前,我们先来了解一下数独的规则:数字1-9在每一行中只能出现一次。数字1-9在每一列中只能出现一次。数字1-9在每个由粗实线分隔的九方格(3x3)中只能出现一次。接下来我们要做的就是在每个格子里填入一个数字,然后判断这个数字是否违规。填入第一个格子首先,在第一个格子里填入1,发现第一列已经有一个1了。这时候需要将之前填入的数字1擦掉,然后在格子中填入2,发现数字在行、列、九宫格中没有重复。然后网格填充成功。填写第二个格子,看下面第二个格子。和之前一样,先尝试填写1。如果发现行、列、九格中的数字不重复,那么这个格子也填满成功。填写第三个格子我们来看看第三个格子。由于前面两格我们已经填好了数字1和2,所以我们就直接开始填数字3。填完3,发现第一行已经有一个3了,再在格子里填4。我发现数字4在行和九格中都重复了,但是还是不成功。然后我试着填数字5,终于没有重复了。一个数字,表示填写成功。...继续填...填到第九格按照这个思路,填到第九格。这时候你会发现九格中最后的数字9冲突了。而且9已经是最后一个数了,这里没办法再填其他的数,只能回到上一格,把第七格的数从8改成9,发现还是有冲突九方格。此时,需要替换上一格(第六格)中的数字。直到没有冲突为止,所以在这个过程中,不仅要往后填数字,还要回头看看前面的数字有没有问题,不断尝试。综上所述,解数独是一个不断试错的过程。为每个网格尝试数字1-9。如果有冲突,则擦除数字,直到填满所有格子。通过代码实现将上面的解决方案体现到代码中,需要用到递归+回溯的思想来实现。在编写代码之前,让我们看看如何表示数独。这是leetcode上的题目:37.SolveSudoku。上一题可以用二维数组来表示。最外层数组有9个数组,代表数独的9行。每个内部数组中的9个字符对应数组的列,未填充的空格用字符('.')表示。constsudoku=[['.','.','.','4','.','.','.','3','.'],['7','.','4','8','.','.','1','.','2'],['.','.','.','2','3','.','4','.','9'],['.','4','.','5','.','9','.','8','.'],['5','.','.','.','.','.','9','1','3'],['1','.','.','.','8','.','2','.','4'],['.','.','.','.','.','.','3','4','5'],['.','5','1','9','4','.','7','2','.'],['4','7','3','.','5','.','.','9','1']]知道如何表示arrays之后,我们来编写代码。constsudoku=[...]//该方法接受row和column两个参数,用于定位数独函数的格子solve(row,col){if(col>=9){//超出第九列,表示这一行已经结束,需要重新开始一行col=0row+=1if(row>=9){//开始另一行后,如果超过第九行,则整个数独已经完成returntrue}}if(sudoku[row][col]!=='.'){//如果格子已经被填满,则填入格子returnsolve(row,col+1)}//尝试填入数字1-9inthegridfor(letnum=1;num<=9;num++){if(!isValid(row,col,num)){//如果是无效数字,跳过数字继续}//填写thenumbersudoku[row][col]=num.toString()//继续往下面的格子里填if(solve(row,col+1)){//如果到最后都没有问题,则数thisgridisnoproblemreturntrue}//如果有问题,solvereturnfalse//表示这个地方需要重新填充sudoku[row][col]='.'//擦除数字}//数字1-9个有填写失败,说明前面的数字有问题//返回FALSE并进行回溯,前面的数字需要重新填写返回false}上面的代码只实现了递归和回溯部分,还有一个isValid方法尚未实施。该方法主要是根据数独的规则进行校验。constsudoku=[...]functionisValid(row,col,num){//判断行是否重复for(leti=0;i<9;i++){if(sudoku[row][i]===num){returnfalse}}//判断该列是否重复for(leti=0;i<9;i++){if(sudoku[i][col]===num){returnfalse}}//判断是否九宫格重复conststartRow=parseInt(row/3)*3conststartCol=parseInt(col/3)*3for(leti=startRow;i
