1. 程式人生 > >js實現數獨算法

js實現數獨算法

class 中間 math bre and set 坐標 移除 log

最近打算用小程序開發個數獨遊戲,所以研究了下數獨可行性數據的算法。具體代碼如下:

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();

js實現數獨算法