分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

用js遍历生成数独可行数据(未优化 有bug版本)

发布时间:2023-09-06 01:41责任编辑:傅花花关键词:js遍历
var chess;var start;var end;//创建棋盘function creatChess(){ ???chess = new Array(); ???for (var i = 0; i < 9; i++) ???{ ???????chess[i] = new Array(); ???????for (var j = 0; j < 9; j++) ???????{ ???????????chess[i][j] = 0; ???????} ???}}//打印棋盘function printChess(){ ???var say = ""; ???for (var i = 0; i < 9; i++) ???{ ???????for (var j = 0; j < 9; j++) ???????{ ???????????say += chess[i][j]; ???????} ???????say += ‘\n‘; ???} ???console.log(say);}//检测横冲突function checkRow(r,c){ ???for (var i = 0; i < 9; i++) ???{ ???????if(i == c) ???????{ ???????????continue;//同一个格子跳过 ???????} ???????if (chess[r][i] == chess[r][c]) ???????{ ???????????return false;//冲突 ???????} ???} ???return true;//没有冲突}//检测列冲突function checkCol(r,c){ ???for (var i = 0; i < 9; i++) ???{ ???????if(i == r) ???????{ ???????????continue;//同一个格子跳过 ???????} ???????if(chess[i][c] == chess[r][c]) ???????{ ???????????return false;//冲突 ???????} ???} ???return true;//没有冲突}//检测小块九宫格冲突function checkArea(r,c){ ???var left = Math.floor(r/3)*3; ???var top = Math.floor(c/3)*3; ???for (var i = left; i < left+3; i++) ???{ ???????for (var j = top; j < top+3; j++) ???????{ ???????????if (i == r && j == c) ???????????{ ???????????????continue;//同一个格子跳过 ???????????} ???????????if (chess[i][j] == chess[r][c]) ???????????{ ???????????????return false;//冲突 ???????????} ???????} ???} ???return true;//没有冲突}//获取一个1-9的随机数字function getRandom(){ ???return Math.floor(Math.random()*9+1);}//检测正确性function checkOk(r,c){ ???return (checkRow(r,c) && checkCol(r,c) && checkArea(r,c))?true:false;}//初始化棋盘function chessInit(){ ???start = new Date().getTime(); ???for (var i = 0; i < 9; i++) ???{ ?????????var count = 0; ?????????for (var j = 0; j < 9; j++) ???????{ ?????????????end = new Date().getTime(); ???????????if (end - start > 500) ???????????{ ???????????????console.log(‘500 ms timeout!\n‘); ???????????????return; ???????????} ???????????if (count == 0) chess[i][j] = getRandom();//第一次进入随机数字 ???????????if (count > 0) ???????????{ ???????????????chess[i][j]++;//第二次进入自增 ???????????????if (chess[i][j] == 10) ???????????????{ ???????????????????chess[i][j] = 1;//归1 ???????????????} ???????????} ???????????if (count == 9) chess[i][j] = 0;//1-9都不可行后编著为0 开始回溯 ???????????if (chess[i][j] == 0) ???????????{ ???????????????if (j > 0) ???????????????{ ?????????????????????//不是第一列 回溯上一列 ???????????????????j -= 2; ?????????????????????continue; ?????????????????} ???????????????else ???????????????{ ???????????????????//第一列 回溯上一行最后一列 ???????????????????i--; ???????????????????j = 8; ???????????????????continue; ?????????????????} ?????????????} ?????????????//检查是否可行 ???????????if (checkOk(i, j)) ???????????{ ?????????????????count = 0;//可行 重置计数器 ???????????} ?????????????else ???????????{ ?????????????????count++;// 计数器加1 ?????????????????j--;// 继续 ???????????} ?????????} ?????}}//初始化function chess(){ ???creatChess();//创建棋盘 ???chessInit();//初始化棋盘 ???printChess();//打印棋盘}chess();//有时陷入死循环 还没有解决 所以加了执行时间限制 防止死循环

用js遍历生成数独可行数据(未优化 有bug版本)

原文地址:https://www.cnblogs.com/godehi/p/8418882.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved