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();//有时陷入死循环 还没有解决 所以加了执行时间限制 防止死循环
原文地址:https://www.cnblogs.com/godehi/p/8418882.html
时间: 2024-10-09 19:46:37