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日

相关文章

  • javascript实现动态导入js与css等静态资源文件的方法

    要在JavaScript中动态导入JS和CSS等静态资源文件,可以使用以下方法: 1. 使用DOM API 可以直接通过JavaScript的DOM API创建<script>和<link>元素,然后将其添加到HTML的<head>或<body>标签中以动态加载JS和CSS文件。 动态导入JS文件 // 利用D…

    JavaScript 2023年5月27日
    00
  • 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标

    当我们需要在网站上显示特定区域的地图界面时,我们需要提取地图的行政区边界的经纬度坐标。在本文中,我们将使用JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标。 准备工作 在开始之前,我们需要在相应的地图开发平台上注册账号并获取相应的API Key。对于高德地图,可以在高德地图开放平台上注册并获取Key;对于百度地图,可以在百度地图开放平台上注…

    JavaScript 2023年6月11日
    00
  • JavaScript表单验证完美代码

    下面是详细讲解 JavaScript 表单验证完美代码的攻略。 什么是 JavaScript 表单验证? JavaScript 表单验证是指利用 JavaScript 编写代码,对用户在表单中输入的数据进行校验。表单验证的目的在于防止用户误输入或恶意输入,确保表单提交的数据格式正确,并提升数据的安全性。 JavaScript 表单验证代码的编写步骤 在进行 …

    JavaScript 2023年6月10日
    00
  • javascript静态的url如何传递

    在JavaScript中,静态的URL(Uniform Resource Locator)可以通过多种方法进行传递。以下是几种可行的方法。 方法一:使用全局变量 在JavaScript中,可以使用全局变量来存储静态的URL,并在需要的时候使用它们。这种方法虽然简单,但存在安全和可维护性方面的问题。 // 存储静态URL的全局变量 var staticUrl …

    JavaScript 2023年6月11日
    00
  • 一个Js文件函数中调用另一个Js文件函数的方法演示

    为了更好地讲解“一个Js文件函数中调用另一个Js文件函数的方法演示”, 我们将分为以下几个部分介绍: 准备工作:建立两个JS文件,定义函数 示例一:在HTML文件中通过script标签依次引入两个JS文件并演示调用 示例二:通过webpack打包两个JS文件并演示调用 1. 准备工作 我们先建立两个JS文件,分别命名为 file1.js 和 file2.js…

    JavaScript 2023年5月27日
    00
  • 不刷新网页就能链接新的js文件方法总结

    “不刷新网页就能链接新的JS文件”是通过AJAX技术实现的。基本流程如下: 使用XMLHttpRequest对象定义AJAX请求。 发送AJAX请求到服务器,获取JS文件的内容。 将新的JS代码注入到页面中。 以下是详细的实现步骤: 1. 定义AJAX请求 function loadScript(url, callback) { var xhr = new …

    JavaScript 2023年5月27日
    00
  • 详解微信小程序中var、let、const用法与区别

    详解微信小程序中var、let、const用法与区别 在微信小程序的开发中,我们常常会使用到JS语言中的变量。而在ES6中,我们可以通过var、let、const来声明变量。这三个关键字有什么区别呢?下面就来详细讲解一下。 var var是ES5中定义的声明变量的关键字。它有以下特点: var声明的变量作用域为函数体内,如果不在函数内则为全局变量。 var声…

    JavaScript 2023年6月11日
    00
  • vue下载excel的实现代码后台用post方法

    下面我将为你详细讲解“vue下载excel的实现代码后台用post方法”的完整攻略。 后台代码的实现 首先,后台需要在接口中返回文件流的形式,以便前端能够接收到需要下载的excel文件。具体代码如下: // 后台 Node.js代码示例 const XLSX = require(‘xlsx’); const fs = require(‘fs’); const…

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