亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript實現數獨解法

2019-11-20 12:56:27
字體:
來源:轉載
供稿:網友

生生把寫過的java版改成javascript版,第一次寫,很不專業,見諒。唉,我是有多閑。

復制代碼 代碼如下:

var Sudoku = {
    init: function (str) {
        this.blank = [];
        this.fixed = [];
        this.cell = [];
        this.trials=[];
        for (i = 0; i < 81; i++) {
            var chr = str.charCodeAt(i);
            if (chr == 48) {
                this.cell[i] = 511;
                this.blank.push(i);
            } else {
                this.cell[i] = 1 << chr - 49;
                this.fixed.push(i);
            }
        }
    },
    showBoard: function () {
        var board = "";
        for (var i = 0; i < 81; i++) {
            if (i % 9 == 0) {
                board = board.concat("/n");
            }
            board = board.concat("[");
            for (var j = 0; j < 9; j++) {
                if ((this.cell[i] >> j & 1) == 1) {
                    board = board.concat(String.fromCharCode(j + 49));
                }
            }
            board = board.concat("]");
        }
        return board;
    },
    check: function () {
        var checkpoint = [0, 12, 24, 28, 40, 52, 56, 68, 80];
        for (var i in checkpoint) {
            var r, b, c;
            r = b = c = this.cell[checkpoint[i]];
            for (j = 0; j < 8; j++) {
                c ^= this.cell[this.getX(checkpoint[i])[j]];
                b ^= this.cell[this.getX(checkpoint[i])[8 + j]];
                r ^= this.cell[this.getX(checkpoint[i])[16 + j]];
            }
            if ((r & b & c) != 0x1FF) {
                return false;
            }
        }
        return true;
    },
    bitCount: function (i) {
        var n = 0;
        for (var j = 0; j < 9; j++) {
            if ((i >> j & 1) == 1)
                n++;
        }
        return n;
    },
    numberOfTrailingZeros: function(i){
        var n = 0;
        for (var j = 0; j < 9; j++) {
            if ((i >> j & 1) ==0)
                n++;
            else{
                break;
            }
        }
        return n;       
    },
    updateCandidates: function () {
        for (var i in this.fixed) {
            var opt = 0x1FF ^ this.cell[this.fixed[i]];
            for (var j = 0; j < 24; j++) {
                this.cell[this.getX(this.fixed[i])[j]] &= opt;
                //!notice
                if (this.cell[this.getX(this.fixed[i])[j]] == 0) {
                    //console.log("Error-0 candidate:"+x[this.fixed[i]][j]);
                    return false;
                }
            }
        }
        return true;
    },
    seekUniqueCandidate: function () {
        for (var bidx in this.blank) {
            var row = 0, col = 0, box = 0;
            for (i = 0; i < 8; i++) {
                row |= this.cell[this.getX(this.blank[bidx])[i]];
                box |= this.cell[this.getX(this.blank[bidx])[8 + i]];
                col |= this.cell[this.getX(this.blank[bidx])[16 + i]];
            }
            if (this.bitCount(this.cell[this.blank[bidx]] & ~row) == 1) {
                this.cell[this.blank[bidx]] &= ~row;
                continue;
            }
            if (this.bitCount(this.cell[this.blank[bidx]] & ~col) == 1) {
                this.cell[this.blank[bidx]] &= ~col;
                continue;
            }
            if (this.bitCount(this.cell[this.blank[bidx]] & ~box) == 1) {
                this.cell[this.blank[bidx]] &= ~box;
            }
        }
    },
    seekFilledable: function () {
        this.fixed = [];
  var _del=[];
        for (var i in this.blank) {
            if (this.bitCount(this.cell[this.blank[i]]) == 1) {
                this.fixed.push(this.blank[i]);
                //console.log("fixed:"+this.blank[i]+"=>"+this.cell[this.blank[i]]);
                //this.blank.splice(i, 1);//to delete it in the loop would cause bug
    _del.push(i);
            }
        }
  while(_del.length>0){
   this.blank.splice(_del.pop(), 1);
  }
    },
    seekMutexCell: function () {
        var two = [];
        for (var n in this.blank) {
            if (this.bitCount(this.cell[this.blank[n]]) == 2) {
                two.push(this.blank[n]);
            }
        }
        for (var i = 0; i < two.length; i++) {
            for (var j = i + 1; j < two.length; j++) {
                if (this.cell[two[i]] == this.cell[two[j]]) {
                    var opt = ~this.cell[two[i]];
                    if (parseInt(two[i] / 9) ==parseInt(two[j] / 9)) {
                        for (n = 0; n < 8; n++) {
                            this.cell[this.getX(two[i])[n]] &= opt;
                        }
                    }
                    if ((two[i] - two[j]) % 9 == 0) {                       
                        for (n = 8; n < 16; n++) {
                            this.cell[this.getX(two[i])[n]] &= opt;
                        }
                    }
                    if ((parseInt(two[i] / 27) * 3 + parseInt(two[i] % 9 / 3)) == (parseInt(two[j] / 27) * 3 + parseInt(two[j] % 9 / 3))) {
                        for (n = 16; n < 24; n++) {
                            this.cell[this.getX(two[i])[n]] &= opt;
                        }
                    }
                    this.cell[two[j]] = ~opt;
                }
            }
        }
    },
    basicSolve: function () {
        do {
            if (!this.updateCandidates(this.fixed)) {
                this.backForward();
            }
            this.seekUniqueCandidate();
            this.seekMutexCell();
            this.seekFilledable();
        } while (this.fixed.length != 0);
        return this.blank.length == 0;
    },   
    setTrialCell: function() {
        for (var i in this.blank) {
            if (this.bitCount(this.cell[this.blank[i]]) == 2) {
                var trialValue = 1 << this.numberOfTrailingZeros(this.cell[this.blank[i]]);
                var waitingValue = this.cell[this.blank[i]] ^ trialValue;
                //console.log("try:[" + this.blank[i] + "]->" + (this.numberOfTrailingZeros(trialValue) + 1) + "#" + (this.numberOfTrailingZeros(waitingValue) + 1));
                this.cell[this.blank[i]] = trialValue;               
                this.trials.push(this.createTrialPoint(this.blank[i], waitingValue, this.cell));
                return true;
            }
        }
        return false;
    },
    backForward: function() {
        if (this.trials.length==0) {
            console.log("Maybe no solution!");
            return;
        }
        var back = this.trials.pop();
        this.reset(back.data);
        this.cell[back.idx] = back.val;
        this.fixed.push(back.idx);
        //console.log("back:[" + back.idx + "]->" + (this.numberOfTrailingZeros(back.val) + 1));
    },
    reset: function(data) {
        this.blank=[];
        this.fixed=[];
        this.cell=data.concat();
        for (var i = 0; i < 81; i++) {
            if (this.bitCount(this.cell[i]) != 1) {
                this.blank.push(i);
            } else {
                this.fixed.push(i);
            }
        }
    },
    trialSolve: function() {
        while (this.blank.length!=0) {
            if (this.setTrialCell()) {
                this.basicSolve();
            } else {
                if (this.trials.length==0) {
                    //console.log("Can't go backforward! Maybe no solution!");
                    break;
                } else {
                    this.backForward();
                    this.basicSolve();
                }
            }
        }
    },
    play: function() {
        console.log(this.showBoard());
        var start = new Date().getMilliseconds();
        if (!this.basicSolve()) {
            this.trialSolve();
        }
        var end = new Date().getMilliseconds();
        console.log(this.showBoard());
        if (this.check()) {
            console.log("[" + (end - start) + "ms OK!]");
        } else {
            console.log("[" + (end - start) + "ms, cannot solve it?");
        }
  //return this.showBoard();
    },
    getX:function(idx){
        var neighbors=new Array(24);
        var box=new Array(0,1,2,9,10,11,18,19,20);
        var r=parseInt(idx/9);
  var c=idx%9;
  var xs=parseInt(idx/27)*27+parseInt(idx%9/3)*3;
        var i=0;
        for(var n=0;n<9;n++){
            if(n==c)continue;
            neighbors[i++]=r*9+n;
        }
        for(var n=0;n<9;n++){
            if(n==r)continue;
            neighbors[i++]=c+n*9;
        }
        for(var n=0;n<9;n++){
            var t=xs+box[n];
            if(t==idx)continue;
            neighbors[i++]=t;
        }
          return neighbors;
    },
 createTrialPoint:function(idx, val, board) {
        var tp = {};
        tp.idx = idx;
        tp.val = val;
        tp.data = board.concat();
        return tp;
 }
};
//Sudoku.init("000000500000008300600100000080093000000000020700000000058000000000200017090000060");
//Sudoku.init("530070000600195000098000060800060003400803001700020006060000280000419005000080079");
Sudoku.init("800000000003600000070090200050007000000045700000100030001000068008500010090000400");
Sudoku.play();

以上就是關于使用javascript實現數獨解法的全部代碼了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产中文字幕| 欧美精品videosex极品1| 欧美成人午夜视频| 亚洲国产精品va在线观看黑人| 2019最新中文字幕| 久久97精品久久久久久久不卡| 日韩高清a**址| 精品国产户外野外| 日韩美女写真福利在线观看| 亚洲国产精品女人久久久| 清纯唯美亚洲激情| 中日韩美女免费视频网址在线观看| 欧美性猛交xxxx久久久| 欧美成人午夜剧场免费观看| 日韩成人中文电影| 欧美人交a欧美精品| 九色精品免费永久在线| 日本精品视频网站| 岛国av一区二区在线在线观看| 日韩精品视频在线| 欧美激情亚洲视频| 久久国产精品免费视频| 久久久天堂国产精品女人| 国产在线高清精品| 91产国在线观看动作片喷水| 韩国精品美女www爽爽爽视频| 欧美亚洲视频在线观看| 亚洲欧美中文另类| 精品视频一区在线视频| 亚洲成人三级在线| 深夜福利国产精品| 国产精品久久久久久网站| 国产成+人+综合+亚洲欧美丁香花| 91a在线视频| 在线播放国产一区二区三区| 欧美亚洲日本网站| 国产精品精品久久久| 久久国产精品久久久久久| 91九色在线视频| 欧美日韩国产限制| 国产99久久精品一区二区永久免费| 久久免费视频网站| 久久久精品影院| 欧美黄色三级网站| 成人黄色网免费| 91精品久久久久久久久久久| 九色成人免费视频| 久久99精品久久久久久琪琪| 久久精品国产v日韩v亚洲| 亚洲石原莉奈一区二区在线观看| 成人综合国产精品| 日韩电影中文字幕| 久久久综合免费视频| 欧美成aaa人片免费看| 国产精品一区专区欧美日韩| 亚洲va欧美va国产综合久久| 色偷偷亚洲男人天堂| 欧美精品日韩www.p站| 国产精品成人va在线观看| 国产精品91久久久| 欧美日韩激情小视频| 日韩av在线一区二区| 国产精品久久久久久超碰| 精品久久久久久久久久久久久| 欧美多人乱p欧美4p久久| 欧美诱惑福利视频| 国产做受69高潮| 亚洲人成77777在线观看网| 中文字幕v亚洲ⅴv天堂| 亚洲高清色综合| 欧洲亚洲免费视频| 国产精品国产三级国产专播精品人| 国产免费一区视频观看免费| 日韩在线欧美在线国产在线| 亚洲色图av在线| 日本精品中文字幕| 久久琪琪电影院| 午夜免费在线观看精品视频| 深夜福利亚洲导航| 国产丝袜一区视频在线观看| 日韩女优人人人人射在线视频| 亚洲欧美制服另类日韩| 九九热这里只有在线精品视| 国产精品成人观看视频国产奇米| 国产亚洲精品美女久久久| 日韩av网站电影| 国产香蕉97碰碰久久人人| 国产69精品久久久久99| 亚洲成色www8888| 欧美午夜美女看片| 久久在精品线影院精品国产| 国产美女直播视频一区| 欧美另类精品xxxx孕妇| 国自在线精品视频| 九九热精品视频| 精品视频久久久| 在线视频日本亚洲性| 亚洲第一福利网站| 亚洲黄色av女优在线观看| 亚洲国产99精品国自产| 亚洲第一网站免费视频| 亚洲日韩中文字幕在线播放| 亚洲人成电影在线| 欧美黑人极品猛少妇色xxxxx| 国产精品电影久久久久电影网| 欧美亚洲成人精品| 色噜噜亚洲精品中文字幕| 亚洲香蕉成视频在线观看| 日韩大陆欧美高清视频区| 亚洲a在线播放| 国产精品久久久久9999| 日韩国产欧美精品在线| 国产精品日韩在线播放| 中文字幕日韩免费视频| 久久69精品久久久久久久电影好| 色偷偷888欧美精品久久久| 国产精品三级美女白浆呻吟| 久久精品精品电影网| 97国产在线观看| 欧美性猛交xxxx富婆弯腰| 国产精品久久久久久av下载红粉| 97久久精品人人澡人人爽缅北| 96pao国产成视频永久免费| 久久久精品一区二区| 91久久精品在线| 有码中文亚洲精品| 亚洲视频在线免费看| 成人日韩av在线| 亚洲精品久久久久| 国产午夜精品免费一区二区三区| 亚洲激情视频网站| 日韩欧美在线第一页| 久久精品电影一区二区| 亚洲国产美女精品久久久久∴| 日韩欧美中文第一页| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲天堂影视av| 色偷偷88888欧美精品久久久| 97精品国产97久久久久久春色| 欧美电影在线免费观看网站| 亚洲成人网久久久| 黄色一区二区三区| 日韩在线观看免费av| 欧美成人免费在线视频| 欧美多人爱爱视频网站| 亚洲美女精品成人在线视频| 91免费精品视频| 亚洲女人被黑人巨大进入| 色香阁99久久精品久久久| 欧美午夜无遮挡| 欧美疯狂做受xxxx高潮| 一区二区欧美久久| 欧美激情网站在线观看| 久久久天堂国产精品女人| 精品偷拍一区二区三区在线看| 欧美日韩国产综合视频在线观看中文| 亚洲va国产va天堂va久久| 欧美视频国产精品| 欧美日韩高清区| 欧洲美女7788成人免费视频| 国产欧美在线播放| 日韩在线免费视频观看| 欧美专区在线播放| 亚洲精品videossex少妇|