美文网首页WEB前端程序开发Web前端之路
前端程序员用Js生成数独算法,大脑堪比计算机,简直是逆天!

前端程序员用Js生成数独算法,大脑堪比计算机,简直是逆天!

作者: a847c1ac3b3f | 来源:发表于2019-05-22 22:39 被阅读0次

    数独的棋盘由 9x9 的方格组成,每一行的数字包含 1 ~ 9 九个数字,并且每一列包含 1 ~ 9 这 9 个不重复的数字,另外,整个棋盘分为 9 个 3x3 的块,每个块中包含的数字也是 1 ~ 9。数独棋盘是非常对称的,所以行和列实际上通过旋转一定的角度就可以相互转换。

    沉迷数独游戏有一阵子,研究了多种数独公式,并且写成了程序算法。

    生成数独终盘有多种方法,其中一种是挖洞法:先生成一个随机的数独终盘,然后随机隐藏某几个位置的数字,让用户进行填空。这里我们用到的方法就是挖洞法,以行为单位进行数字的填充。

    初始的挖洞法步骤:

    生成的一个空的数独棋盘,棋盘中每个格子的数字都是 0;

    数独棋盘用 Board 对象表示,该对象中有 81 个 Grid 对象,表示 9x9 的方格。

    // class Boardfor(leti =0; i <9; i++ ) {for(letj =0; j <9; j++ ) {this.grids[i *9+ j] =newGrid( i, j );    }}

    生成 1~9 的乱序排列并填充第一行(填充第一列的效果和填充第一行再进行旋转其实是一样的效果,由于填充第一行元素时,其它各行都没有填充过数字,因此第一行的约束条件是最少的);

    // populate the first rowletrow0 =this.getRowGrids(0);letrandomArray = Utils.getRandomValue();randomArray.forEach((element, index ) =>{    row0[index].setValue( element );});

    填充完第一行的数独棋盘:

    填充第 2 行时,计算第 1 个格子可以使用的数字集合;

    这个集合是从一个数组 [1, 2, 3, 4, 5, 6, 7, 8, 9] (把它称为 基本数组)中剔除掉已经被用过的数字。这些用过的数字是从这个格子所在的行、列及块中有效的数字。例如上图中,第 2 行,第 1 列(在数组中序号分别是 1,0)已经用过的数字是 2, 4, 7,那么第 2 行第 1 列可以使用的数字就只能在剩下未使用过的数字中随机选择一个;

    从 (2, 1) 格子处选择可用数字集合中的一个,填充至该位置;

    重复 3~4 步,填充完第 2 行;

    重复第 3~5 步,依次填充完其它行;

    完成数独终盘。

    如果有想学习web前端的同学,可来我们的web前端技术学习QQ群:608334068,免费送整套系统的web前端视频教程!我每晚上8点还会在群内直播讲解前端知识,这是一个仅供粉丝朋友们学习交流的群,欢迎大家前来学习哦~不是学习web前端的小伙伴非诚勿扰哦下面是部分资料截图:

    欢迎关注胖胖爱前端的简书号,可视化学习java,每天更新文章,让Java学习更加简单。

    声明:本文内容来源于网络,如有侵权请联系删除

    相关文章

      网友评论

        本文标题:前端程序员用Js生成数独算法,大脑堪比计算机,简直是逆天!

        本文链接:https://www.haomeiwen.com/subject/javpzqtx.html