尝试在Javascript中实现数独求解器的逻辑哪里出错了?

问题描述

const N = 4;
const fourbyfour = [
  [1,4],[3,4,1,2],[2,3],[4,3,2,1],];

function solve(board) {
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
      if (board[i][j] === 0) {
        for (let k = 1; k < N + 1; k++) {
          board[i][j] = k;
          if (isValidBoard(board)) {
            if (isSolved(board)) return board;
            else solve(board);
          }
        }
      }
    }
  }
  return;
}

function isSolved(board) {
  let cells = [];
  for (let row of board) {
    cells.push(...row);
  }
  return !cells.includes(0);
}

function isValidBoard(board) {
  // Check rows are valid
  for (let i = 0; i < N; i++) {
    const row = board[i].filter((cell) => cell !== 0);
    if (new Set(row).size !== row.length) {
      return false;
    }
  }

  // Check columns are valid
  for (let i = 0; i < N; i++) {
    let column = [];
    for (let j = 0; j < N; j++) {
      if (board[j][i] !== 0) column.push(board[j][i]);
    }
    if (new Set(column).size !== column.length) {
      return false;
    }
  }

  const root = Math.sqrt(N);
  // Check each grid
  for (let i = 0; i < N; i += root) {
    for (let j = 0; j < N; j += root) {
      const square = [];
      for (let k = i; k < i + root; k++) {
        for (let l = j; l < j + root; l++) {
          if (board[k][l] !== 0) {
            square.push(board[k][l]);
          }
        }
      }
      if (new Set(square).size !== square.length) {
        return false;
      }
    }
  }
  return true;
}
console.table(solve(fourbyfour));

solve()继续返回未定义。 我相当确定问题出在solve函数中,并且与isSolved()和isValidBoard()不相关。解决功能是获取正确的电路板,如果我在console.log上记录了该电路板而不是退回该电路板,则会打印正确的电路板,但是由于某种原因,它没有被退回。

解决方法

您永远不会返回递归的值。您需要在输入solve second 时间返回。

此外,console.table不会在代码段中正常工作

const N = 4;
const fourbyfour = [
  [1,4],[3,4,1,2],[2,3],[4,3,2,1],];

function solve(board) {
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
      if (board[i][j] === 0) {
        for (let k = 1; k < N + 1; k++) {
          board[i][j] = k;
          if (isValidBoard(board)) {
            if (isSolved(board)) {
              return board;
            } else {
              return solve(board);
            }
          }
        }
      }
    }
  }
  return 'test';
}

function isSolved(board) {
  let cells = [];
  for (let row of board) {
    cells.push(...row);
  }
  return !cells.includes(0);
}

function isValidBoard(board) {
  // Check rows are valid
  for (let i = 0; i < N; i++) {
    const row = board[i].filter((cell) => cell !== 0);
    if (new Set(row).size !== row.length) {
      return false;
    }
  }

  // Check columns are valid
  for (let i = 0; i < N; i++) {
    let column = [];
    for (let j = 0; j < N; j++) {
      if (board[j][i] !== 0) column.push(board[j][i]);
    }
    if (new Set(column).size !== column.length) {
      return false;
    }
  }

  const root = Math.sqrt(N);
  // Check each grid
  for (let i = 0; i < N; i += root) {
    for (let j = 0; j < N; j += root) {
      const square = [];
      for (let k = i; k < i + root; k++) {
        for (let l = j; l < j + root; l++) {
          if (board[k][l] !== 0) {
            square.push(board[k][l]);
          }
        }
      }
      if (new Set(square).size !== square.length) {
        return false;
      }
    }
  }
  return true;
}
console.log(solve(fourbyfour));

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...