let puzzle = [
    [0, 0, 7, 0, 0, 3, 5, 0, 0],
    [6, 0, 5, 4, 0, 8, 3, 0, 2],
    [0, 0, 4, 5, 2, 0, 9, 0, 6],
    [0, 0, 0, 0, 7, 1, 2, 0, 9],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [8, 0, 9, 2, 3, 0, 0, 0, 0],
    [9, 0, 1, 0, 8, 5, 6, 0, 0],
    [7, 0, 3, 9, 0, 2, 8, 0, 5],
    [0, 0, 8, 7, 0, 0, 1, 0, 0]
];

class Sudoku 
{

    constructor(puzzle) 
    {
        this.sudoku = puzzle;
    }

    isPossible(y, x, n) 
    {
        for (let i = 0; i < 9; i++) 
        {
            if (this.sudoku[y][i] == n)
                return false;
        }

        for (let i = 0; i < 9; i++) 
        {
            if (this.sudoku[i][x] == n)
                return false;
        }

        let y0 = (Math.floor(y / 3) * 3);
        let x0 = (Math.floor(x / 3) * 3);
        
        for (let i = 0; i < 3; i++) 
        {
            for (let j = 0; j < 3; j++) 
            {
                if (this.sudoku[y0 + i][x0 + j] == n)
                    return false;
            }
        }

        return true;
    }

    solve()
    {
        for (let y = 0; y < 9; y++)
        {
            for (let x = 0; x < 9; x++)
            {
                if (this.sudoku[y][x] == 0)
                {
                    for (let n = 1; n <= 9; n++)
                    {
                        if (this.isPossible(y, x, n))
                        {
                            this.sudoku[y][x] = n;
                            this.solve();
                            this.sudoku[y][x] = 0;
                        }
                    }

                    return;
                }
            }
        }

        console.table(this.sudoku);
    }
}

let s = new Sudoku(puzzle);
s.solve();

这本书写得很好.然而,调试表明,在console.table之后,代码继续运行,并将矩阵恢复到其原始状态.但是,再也不会执行console.table行.因此,在solve方法之外,this.sudoku只是原始的puzzle矩阵.

推荐答案

我将这样做,只需添加solved个测试和一些循环中断...

const Sudoku = (()=>
  {
  let 
    grid   = null
  , solved = false 
    ;
  const
    nums = [1,2,3,4,5,6,7,8,9]
  , isPossible = (row, col, num) => 
      {
      for (let c in grid)  if (grid[row][c] === num) return false
      for (let r in grid)  if (grid[r][col] === num) return false
      row -= row %3
      col -= col %3
      for (let i=0, c=col; i<3; i++,c++)
      for (let j=0, r=row; j<3; j++,r++)
        if (grid[r][c] === num) return false
      return true
      }
  , solve = () =>
      {
      for (let row in grid) 
        {
        if (solved) break
        for (let col in grid) 
          {
          if (solved) break
          if (grid[row][col] === 0)
            {
            for (let num of nums)
              if (isPossible(row, col, num))
                {
                grid[row][col] = num
                solve()
                if (solved) break 
                grid[row][col] = 0
                }  
            return
        } } } 
      solved = true
      };
  return (puzzle) =>
    {
    grid   = puzzle
    solved = false
    solve()
    return solved
    }
  })()


const puzzle =
  [ [ 0, 0, 7, 0, 0, 3, 5, 0, 0 ]
  , [ 6, 0, 5, 4, 0, 8, 3, 0, 2 ]
  , [ 0, 0, 4, 5, 2, 0, 9, 0, 6 ]
  , [ 0, 0, 0, 0, 7, 1, 2, 0, 9 ]
  , [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
  , [ 8, 0, 9, 2, 3, 0, 0, 0, 0 ]
  , [ 9, 0, 1, 0, 8, 5, 6, 0, 0 ]
  , [ 7, 0, 3, 9, 0, 2, 8, 0, 5 ]
  , [ 0, 0, 8, 7, 0, 0, 1, 0, 0 ]
  ]

let resolved = Sudoku(puzzle)

console.log( resolved ? 'resolved !':'not resolved !','\n' )

console.log(JSON.stringify(puzzle).replaceAll('],[',']\n,['))

// console.table( )  doesn't work on snippet
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

Javascript相关问答推荐

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

如何获取转换字节的所有8位?

如何在RTK上设置轮询,每24小时

在我的html表单中的用户输入没有被传送到我的google表单中

无法读取未定义错误的属性路径名''

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

Eval vs函数()返回语义

使用VUE和SCSS的数字滚动动画(&;内容生成)

如何使用基于promise (非事件emits 器)的方法来传输数据?

通过跳过某些元素的对象进行映射

如何在Java脚本中并行运行for或任意循环的每次迭代

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

对不同目录中的Angular material 表列进行排序

在Press Reaction本机和EXPO av上播放单个文件

限制数组中每个元素的长度,

Played link-Initialize.js永远显示加载符号

带元素数组的Mongo聚合

如何从图表中映射一组图表-js使用REACT