JS实现判断有效的数独算法示例

判断有效的数独是一道常见的编程面试题,本文将介绍如何使用JavaScript实现一个有效的数独判断算法。

如何表示数独?

数独可表示为一个9x9的二维数组,其中空白单元格表示为0,已填充数字的单元格则为1至9之间的数字。

示例:

const board = [
  [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]
];

算法流程

对于数独的有效性判断算法可以按照以下流程进行实现:

  1. 验证每一行是否符合规则,即是否包含1到9的数字,而且不能有重复数字。
  2. 验证每一列是否符合规则,即是否包含1到9的数字,而且不能有重复数字。
  3. 验证每一宫是否符合规则,即是否包含1到9的数字,而且不能有重复数字。

代码实现

下面是使用JavaScript实现的代码:

function isValidSudoku(board) {
  const rows = [];
  const cols = [];
  const boxes = [];

  // 初始化rows、cols和boxes数组
  for (let i = 0; i < 9; i++) {
    rows[i] = new Set();
    cols[i] = new Set();
    boxes[i] = new Set();
  }

  // 遍历数独中的每一个元素
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      const num = board[i][j];

      // 如果当前格是空白,直接跳过当前轮次
      if (num === 0) continue;

      // 计算该值所属的宫
      const boxIdx = Math.floor(i / 3) * 3 + Math.floor(j / 3);

      // 检测该值是否在当前的行、列或宫中已存在
      if (rows[i].has(num) || cols[j].has(num) || boxes[boxIdx].has(num)) {
        return false;
      } else {
        rows[i].add(num);
        cols[j].add(num);
        boxes[boxIdx].add(num);
      }
    }
  }

  return true;
}

示例一

假设我们有以下数独:

const board = [
  [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(isValidSudoku(board)); // true

示例二

假设我们有以下数独:

const board = [
  [8, 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, 0, 0, 0, 7, 9]
];

我们可以使用以下代码来判断该数独是否有效:

console.log(isValidSudoku(board)); // false

在以上两个示例中,第一个数独是有效的,而第二个数独则无效,因为第一行和第一列都存在重复数字。

总结

以上是使用JavaScript实现判断有效的数独算法示例的完整攻略,通过将数独表示为二维数组,并使用一个Set数据结构来存储每行、每列和每宫中已存在的数字,最终得以实现有效的数独判断。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现判断有效的数独算法示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • js动态获取时间的方法分析

    让我为你详细讲解“js动态获取时间的方法分析”的完整攻略。 1. 时间获取的概述 在JavaScript中,获取时间的方法有很多,常见的有Date对象、moment.js等。其中,Date对象是最常用的时间获取方式,它可以获取当前时间或指定日期的时间,并对时间进行格式化处理。 2. 使用Date对象获取时间 Date对象获取时间非常简单,只需实例化该对象,即…

    JavaScript 2023年5月27日
    00
  • JavaScript全局函数使用简单说明

    下面是关于“JavaScript全局函数使用简单说明”的完整攻略。 什么是JavaScript全局函数 JavaScript全局函数指的是无需创建对象即可调用的函数。在JavaScript中,有一些函数不需要为其创建对象即可使用,这些函数就被称为 JavaScript全局函数。这些函数可以让我们更方便地使用许多常用操作。 JavaScript全局函数的简单说…

    JavaScript 2023年5月27日
    00
  • js判断上传文件后缀名是否合法

    我们来详细讲解一下“js判断上传文件后缀名是否合法”的攻略。 1. 获取文件的后缀名 在判断上传文件的后缀名是否合法时,需要先获取到上传的文件的后缀名。可以通过以下代码来获取文件后缀名: var fileName = "example.jpg"; // 假设上传的文件名为 example.jpg var fileExtension = f…

    JavaScript 2023年5月27日
    00
  • 跨域设置Cookie失效问题解决方案原理分析

    当我们通过AJAX等方式在前端向服务端发送请求时,如果请求的地址与前端页面所在的域名不同,就会触发跨域问题。跨域问题是由浏览器的同源策略引起的。 在这种情况下,如果服务端返回了带有Set-Cookie头部的响应,则浏览器默认不会设置该Cookie,导致Cookie失效问题。 解决这个问题的方法是使用CORS(跨域资源共享)技术,在服务端的响应头中添加”Acc…

    JavaScript 2023年6月11日
    00
  • 解决layui的form里的元素进行动态生成,验证失效的问题

    针对“解决layui的form里的元素进行动态生成,验证失效的问题”,我们可以采用以下攻略: 动态生成表单元素 在动态生成表单元素的过程中,需要为每一个生成的表单元素添加 layui 的 form 类属性,示例如下: <input type=”text” name=”username” lay-verify=”required” class=”layu…

    JavaScript 2023年6月10日
    00
  • JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)

    JS数组操作是对数组进行增加、删除、翻转、转字符串、取索引、截取、剪接和数组合并等常见操作。 增加操作 数组的增加操作包括push和unshift,push用于在数组末尾添加一个或多个元素,unshift用于在数组开头添加一个或多个元素。示例如下: let arr = [1, 2, 3]; // push arr.push(4); console.log(a…

    JavaScript 2023年5月27日
    00
  • 详解用场景去理解函数柯里化(入门篇)

    详解用场景去理解函数柯里化(入门篇)完整攻略 什么是函数柯里化? 函数柯里化是一种将具有 n 个参数的函数转换成只接受一个参数的函数,并返回一个新函数的技术。这个新函数会接受剩余的参数并返回结果。这个过程就像为函数的第一个参数绑定值一样,常用的方式是使用闭包保存参数和状态,再通过函数的多次调用形成链式调用的效果。 柯里化的优势和适用场景 函数柯里化可以让你更…

    JavaScript 2023年5月19日
    00
  • javascript判断一个变量是数组还是对象

    判断一个变量是数组还是对象是编写 JavaScript 程序中常见的任务,我们可以使用原生 JavaScript 提供的一些方法来实现这个功能。 方法一:使用 typeof 运算符和 Array.isArray() 方法 在 JavaScript 中,我们可以使用 typeof 运算符来检查一个变量的类型,Array.isArray() 方法用来判断一个变量…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部