最近打算用小程序开发个数独游戏,所以研究了下数独可行性数据的算法。具体代码如下:

var chess;//棋盘所有棋子的状态
var chessStack = [];//缓存点
//创建棋盘
function creatChess()
{chess = [];for (var i = 0; i < 9; i++){chess[i] = [];for (var j = 0; j < 9; j++){chess[i][j] = {num:0,fixed:false,temp:[1,2,3,4,5,6,7,8,9]};}}
}//打印棋盘
function printChess()
{var say = "";for (var i = 0; i < 9; i++){for (var j = 0; j < 9; j++){say += chess[i][j].num;}say += '\n';}console.log(say);
}//预先设置互不影响的九宫格位置数字
function setArea(a,b)
{var temp = [1,2,3,4,5,6,7,8,9];//每个小九宫格包含的九个数字for (var i = a; i < b; i++){for (var j = a; j < b; j++){var len = temp.length;//temp剩下的长度var index = getRandom(len);//随机抽取一个chess[i][j].num = temp[index];//赋值chess[i][j].fixed = true;//赋值temp.splice(index,1);//删除已赋值的
        }}
}//设定数字 可以求解
function setPre(r,c,v)
{chess[r][c] = {num:v,fixed:true,temp:[]};
}//获取一个随机数字下标
function getRandom(a)
{return Math.floor(Math.random()*a);
}//初始化棋盘
function chessInit()
{for (var i = 0; i < 9; i++){for (var j = 0; j < 9; ){//当数字确定了 则下一个 不然随机取一个if (!chess[i][j].fixed){var len = chess[i][j].temp.length;//temp剩下的长度//当还有可选数字if (len > 0){var index = getRandom(len);//随机抽取一个chess[i][j].num = chess[i][j].temp[index];//赋值chess[i][j].temp.splice(index,1);//删除已赋值的chessStack.push([i,j,JSON.parse(JSON.stringify(chess))]);//存储chess[i][j].fixed = true;//变为确定if(!checkTempNum(i,j)){var cs = chessStack.pop();//退格i = cs[0];j = cs[1];chess = cs[2];//取出棋盘存储点
                    }}else{// 当没有可选数字了var cs = chessStack.pop();//退格i = cs[0];j = cs[1];chess = cs[2];//取出棋盘存储点
                }}else{j++;//进一个
            }}}
}//删除特定元素
function removeByValue(r,c,v)
{if (chess[r][c].num == v){return false;//冲突了
    }if (chess[r][c].fixed){return true;//已经确定了 则无需删除了
    }var len = chess[r][c].temp.length;for (var i = 0; i < len; i++){if (chess[r][c].temp[i] == v){chess[r][c].temp.splice(i,1);//删除备选数字break;//退出
        }}return chess[r][c].temp.length==0?false:true;//没有确定而且没有备选元素了 那么返回错误
}//移除相关20格备选列表某数字
function checkTempNum(r,c)
{var i,j;var num = chess[r][c].num;//要移除的数字//检查列for (i = 0; i < 9 ; i++){if (i != r && !removeByValue(i,c,num)) return false;//移除备选数字和判定数字合法性
    }//检查行for (j = 0; j < 9 ; j++){if(j != c && !removeByValue(r,j,num)) return false;//移除备选数字和判定数字合法性
    }//检查小九宫var left = Math.floor(r/3)*3;//得出小九宫的左上角坐标var top = Math.floor(c/3)*3;//得出小九宫的左上角坐标for (i = left; i < left+3; i++){for (j = top; j < top+3; j++){if (i == r && j == c){continue;//同一个格子跳过
            }if(!removeByValue(i,j,num)) return false;//移除备选数字和判定数字合法性
        }}return true;
}//初始化
function chess()
{creatChess();//创建棋盘// setArea(0,3);//随机设置左上角九宫格数字// setArea(3,6);//随机设置中间九宫格数字// setArea(6,9);//随机设置右下角九宫格数字setPre(0,2,5);setPre(0,3,3);setPre(1,0,8);setPre(1,7,2);setPre(2,1,7);setPre(2,4,1);setPre(2,6,5);setPre(3,0,4);setPre(3,5,5);setPre(3,6,3);setPre(4,1,1);setPre(4,4,7);setPre(4,8,6);setPre(5,2,3);setPre(5,3,2);setPre(5,7,8);setPre(6,1,6);setPre(6,3,5);setPre(6,8,9);setPre(7,2,4);setPre(7,7,3);setPre(8,5,9);setPre(8,6,7);chessInit();//初始化棋盘printChess();//打印棋盘
}chess();

转载于:https://www.cnblogs.com/godehi/p/8423103.html

js实现数独算法(优化版本)相关推荐

  1. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  2. 数独算法+文件读取+结果保存到文件+Python3版本

    操作系统:win10 64bit Python版本:Python 3.7.3 数独算法很多,在网上找了个C语言的,感觉还不错,用python改了一下,增加文件操作,从文件读取数独题目,运行后,把结果保 ...

  3. 机器学习:BM25算法【TD-IDF的优化版本】

    一.BM25算法原理 BM25(BM=best matching)是TDIDF的优化版本,首先我们来看看TFIDF是怎么计算的 tfidfi=tf∗idf=词i的数量词语总数∗log总文档数包含词i的 ...

  4. JS数组去重算法实现

    1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方 ...

  5. 与金山云的樊博士聊了聊AV1算法优化以及如何提升沉浸式视频的沉浸感

    讲师介绍 樊鸿飞,金山云高级研发总监,北京大学计算机科学与技术专业博士,负责视频云的VR.视频编码.人工智能等技术线研发,近年来主要从事沉浸式视频.视频编码.图像处理.计算机视觉方向上的研究与技术落地 ...

  6. 多线程队列的算法优化

    [导读]:本文主要讲解多线程队列的优化. 多线程队列(Concurrent Queue)的使用场合非常多,高性能服务器中的消息队列,并行算法中的Work Stealing等都离不开它.对于一个队列来说 ...

  7. js大量数据计算性能优化

    js大量数据计算性能优化 测试相关内容 1. forEach和for循环 2. `indexOf`的效率问题 3. 遍历时的浅拷贝 4. filter和for的性能比较1 5. filter和for的 ...

  8. 数独算法-递归与回溯

    1.概述 数独(Sudoku)是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复. 1)终盘 ...

  9. 【PID优化】基于matlab粒子群算法优化BP神经网络PID控制【含Matlab源码 2022期】

    ⛄一.粒子群算法优化BP神经网络PID控制简介 BP神经网络PID控制算法 传统PID控制器作为一种线性控制器,具备结构,容易实现的优点,其基本原理是将系统的实际输出值和期望输出值之间的偏差按照比例. ...

最新文章

  1. 【Gstreamer】在虚拟机中无法使用硬件加速:gstreamer1.0-vaapi
  2. python时间差转换成天数_Python实现计算两个时间之间相差天数的方法
  3. [MYSQL]如何并发查询并更新
  4. oracle表数据的导出到excel文件,文件怎么导出到excel表格数据库-如何导出oracle数据库中某张表到excel...
  5. Some of the operators in the model are not supported by the standard TensorFlow Lite runtime.
  6. 图书馆占座系统(SSM,JQUERY-EASYUI,MYSQL)
  7. word for Mac 符号插入
  8. 常见问题数组索引越界异常
  9. 医院随访系统标准化流程之三级随访
  10. 计算机自带游戏打不开,win10系统自带游戏打不开的还原步骤
  11. 【Linux】在终端中粘贴字符时头尾出现“0~“和“1~“的特殊字符
  12. Mac ssh: connect to host XXX.XXX.XXX.XXX port XX: Operation timed out的问题解决
  13. 【LTspice】006 实际电容 阻抗特性曲线
  14. MacOS安装git
  15. html显示隐藏图片,简单的图片显示与隐藏
  16. ccd视觉检测设备主要应用于哪些场景
  17. Satwe楼板能用弹性模计算吗_工程设计中刚性楼板假定与弹性楼板假定的应用与分析...
  18. CentOS 7虚拟机安装Oracle11g详解
  19. 芯洲科技,提供专业的高品质、高性能、高功率密度、超低静态电流功率集成芯片和模块解决方案
  20. 短视频实战全攻略:从0开始打造爆款抖音号

热门文章

  1. java与javascript之间json格式数据互转
  2. c#异步socket
  3. 纯css的accordion效果
  4. object转成实体对象_程序员的浪漫,new一个对象
  5. java map 迭代删除元素,java – 如何在迭代时删除和添加元素到TreeMap?
  6. linux igmp v3 过滤ip,网络 – Linux和IGMPv3上的多播加入
  7. java随机生成不重复的数组_Java生成不重复的随机数组的方法
  8. 兰州现超级“牛大”碗比腰粗:牛肉面吃出火锅范
  9. linux集群-keepalived介绍-用keepalived配置高可用集群
  10. [转] Android系统版本号和Android API level对应表