算法之有效的数独

150 阅读1分钟
function Sudoku(board) {
  if (!board.length) return false;
  for (let i = 0; i < board.length; i++) {
    let rArr = []; // 保存一行中已有的数字
    let cArr = []; // 保存一列中已有的数字
    for (let j = 0; j < board[i].length; j++) {
      if (rArr.includes(board[i][j]) || cArr.includes(board[j][i])) {
        // 遍历到的数字已经存在于对应的行数组或对应的列数组
        return false;
      }
      if (board[i][j] !== '.') {
        // 存储空格以外的数字
        rArr.push(board[i][j]);
      }
      if (board[j][i] !== '.') {
        // 存储空格以外的数字
        cArr.push(board[j][i]);
      }

      if (i % 3 === 0 && j % 3 === 0) {
        // 3*3 宫格中 3*3的起始坐标分别为00 03 06 09 30 60 90 33 36 39 63 66 69 93 96 99
        let tArr = []; // 保存 3*3 的格子中已有的数据
        for (let k = 0; k < 3; k++) {
          for (let l = 0; l < 3; l++) {
            if (tArr.includes(board[k][l])) {
              return false;
            } else if (board[k][l] !== '.') {
              tArr.push(board[k][l]);
            }
          }
        }
      }
    }
    return true;
  }
}

const arr = [
  ['9', '3', '.', '.', '7', '.', '.', '.', '.'],
  ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
  ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
  ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
  ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
  ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
  ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
  ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
  ['.', '.', '.', '.', '8', '.', '.', '7', '9'],
];

const res = a(arr);
console.log(res);