答案校验是正确的,但只显示通过5/6组案例

let arr = [];
while ((line = readline())) {
  arr.push(line.split(" ").map(Number));
}
let ans = run(arr);
for (let i = 0; i < 9; i++) {
  console.log(ans[i].join(" "));
}
function run(arr) {
  //创建数据备份,进行深度递归
  let tempArr = new Array(arr.length)
    .fill(0)
    .map((v) => new Array(arr.length).fill(0));
  //引用数据类型的深拷贝,防止对母数据的修改
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      tempArr[i][j] = arr[i][j];
    }
  }
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      if (tempArr[i][j] == 0) {
        //检查当前位置可用于替换的元素数组
        let temp = check(tempArr, i, j);
        if (temp.length == 0) {
          return;
        } else {
          while (temp.length) {
            //这里可以改成pop():依据出栈顺序,能通过的案例也有所变化
            tempArr[i][j] = temp.shift();
            if (i == 8 && j == 8) {
              return tempArr;
            }
            //递归新数组,最后一层有结果则返回
            let res = run(tempArr);
            if (res) {
              //可以看成是出口的上一层,最终返回结果的链式传递
              return res;
            }
          }
          //while遍历结束都没有找到合适的替换元素,则退出当前函数
          return;
        }
      }
    }
  }
  //递归出口
  return tempArr;
}
function check(arr, x, y) {
  let temp = [];
  let a = Math.floor(x / 3) * 3;
  let b = Math.floor(y / 3) * 3;
  //检查九宫格
  for (let i = a; i < a + 2; i++) {
    for (let j = b; j < b + 2; j++) {
      if (arr[(i, j)] != 0) {
        temp.push(arr[i][j]);
      }
    }
  }
  //检查同一行和同一列
  for (let i = 0; i <= 8; i++) {
    if (arr[x][i] != 0) {
      temp.push(arr[x][i]);
    }
    if (arr[i][y] != 0) {
      temp.push(arr[i][y]);
    }
  }
  //手动去重
  temp.filter((item, index, array) => {
    return index == array.indexOf(item);
  });
  let res = [];
  for (let i = 1; i <= 9; i++) {
    if (!temp.includes(i)) {
      res.push(i);
    }
  }
  return res;
}