为了账号安全,请及时绑定邮箱和手机立即绑定

带有爪哇脚本的数独求解器

带有爪哇脚本的数独求解器

守着一只汪 2022-09-29 15:17:46
我尝试用Javascript构建数独求解器。代码确实解决了它,但还有一些空白点。我使用 Javascript、回溯和递归。在第一个函数中,我检查一个空白点(0)上的数字是可能的,在第二个函数中,我调用第一个函数来检查空点,并尝试在该点上放置一个介于1和9之间的数字有人能看到我做错了什么吗?const userInput = [  [5, 3, 0, 0, 7, 0, 0, 0, 0],  [6, 0, 0, 1, 9, 5, 0, 0, 0],  [0, 9, 8, 0, 0, 0, 0, 6, 0],  [8, 0, 0, 0, 6, 0, 0, 0, 3],  [4, 0, 0, 8, 0, 3, 0, 0, 1],  [7, 0, 0, 0, 2, 0, 0, 0, 6],  [0, 6, 0, 0, 0, 0, 2, 8, 0],  [0, 0, 0, 4, 1, 9, 0, 0, 5],  [0, 0, 0, 0, 8, 0, 0, 7, 9],];function possible(y, x, n) {  for (let i = 0; i <= 8; i++) {    if (userInput[y][i] === n) {      return false;    }  }  for (let i = 0; i <= 8; i++) {    if (userInput[i][x] === n) {      return false;    }  }  let xSquare = Math.floor(x / 3) * 3;  let ySquare = Math.floor(y / 3) * 3;  for (let i = 0; i <= 2; i++) {    for (let j = 0; j <= 2; j++) {      if (userInput[ySquare + i][xSquare + j] === n) {        return false;      }    }  }  return true;}function solve() {  for (let y = 0; y <= 8; y++) {    for (let x = 0; x <= 8; x++) {      if (userInput[y][x] === 0) {        for (let n = 1; n <= 9; n++) {          if (possible(y, x, n)) {            userInput[y][x] = n;            solve();          }        }      }    }  }}
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您正在编写回溯算法,但这里没有回溯。当前的算法假设每个猜测的值都是完美的 - 如果有任何不完美(这是可以保证的,因为值是从1到9的顺序猜测的),则无法取得进展。


要回溯,您需要将无法扩展为已解决状态的单元格清零,并在单元格的所有可能性耗尽时将 false 返回到父状态。


此外,函数最好采用参数并返回值,而不是改变全局状态。


应用这些最小的修改将产生以下结果。还有改进的余地。例如,该函数必须重复“搜索”下一个打开的正方形。solve


function possible(board, y, x, n) {

  for (let i = 0; i < 9; i++) {

    if (board[y][i] === n || board[i][x] === n) {

      return false;

    }

  }


  const xSquare = Math.floor(x / 3) * 3;

  const ySquare = Math.floor(y / 3) * 3;


  for (let i = 0; i < 3; i++) {

    for (let j = 0; j < 3; j++) {

      if (board[ySquare+i][xSquare+j] === n) {

        return false;

      }

    }

  }


  return true;

}


function solve(board) {

  for (let y = 0; y < 9; y++) {

    for (let x = 0; x < 9; x++) {

      if (board[y][x] === 0) {

        for (let n = 1; n <= 9; n++) {

          if (possible(board, y, x, n)) {

            board[y][x] = n;

            

            if (solve(board)) return board;

          }

        }

        

        board[y][x] = 0;

        return false;

      }

    }

  }

  

  return board;

}


const puzzle = [

  [5, 3, 0, 0, 7, 0, 0, 0, 0],

  [6, 0, 0, 1, 9, 5, 0, 0, 0],

  [0, 9, 8, 0, 0, 0, 0, 6, 0],

  [8, 0, 0, 0, 6, 0, 0, 0, 3],

  [4, 0, 0, 8, 0, 3, 0, 0, 1],

  [7, 0, 0, 0, 2, 0, 0, 0, 6],

  [0, 6, 0, 0, 0, 0, 2, 8, 0],

  [0, 0, 0, 4, 1, 9, 0, 0, 5],

  [0, 0, 0, 0, 8, 0, 0, 7, 9],

];


console.log(solve(puzzle).map(e => "" + e));


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信