> 웹 프론트엔드 > JS 튜토리얼 > Javascript는 Sudoku 솔루션_javascript 기술을 구현합니다.

Javascript는 Sudoku 솔루션_javascript 기술을 구현합니다.

WBOY
풀어 주다: 2016-05-16 16:09:39
원래의
1311명이 탐색했습니다.

Shengsheng에서 제가 작성한 Java 버전을 Javascript 버전으로 변경했습니다. 처음 작성하는 것이므로 매우 비전문적입니다. 죄송합니다. 아, 나는 얼마나 자유로운가.

코드 복사 코드는 다음과 같습니다.

var 스도쿠 = {
    초기화: 함수(str) {
        this.blank = [];
        this.fixed = [];
        this.cell = [];
        this.trials=[];
        for (i = 0; i             var chr = str.charCodeAt(i);
            if (chr == 48) {
                this.cell[i] = 511;
                this.blank.push(i);
            } 그 밖의 {
                this.cell[i] = 1 << 문자 - 49;
                this.fixed.push(i);
            }
        }
    },
    showBoard: 함수() {
        var 보드 = "";
        for (var i = 0; i < 81; i ) {
            if (i % 9 == 0) {
                보드 = Board.concat("n");
            }
            보드 = 보드.concat("[");
            for (var j = 0; j < 9; j ) {
                if ((this.cell[i] >> j & 1) == 1) {
                    보드 = 보드.concat(String.fromCharCode(j 49));
                }
            }
            보드 = 보드.concat("]");
        }
        반납판;
    },
    확인: 함수 () {
        var 체크포인트 = [0, 12, 24, 28, 40, 52, 56, 68, 80];
        for (체크포인트의 var i) {
            var r, b, c;
            r = b = c = this.cell[checkpoint[i]];
            for (j = 0; 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) {
                false를 반환합니다.
            }
        }
        true를 반환합니다.
    },
    비트카운트: 함수 (i) {
        var n = 0;
        for (var j = 0; j             if ((i >> j & 1) == 1)
                ;
        }
        n을 반환합니다;
    },
    numberOfTrailingZeros: 함수(i){
        var n = 0;
        for (var j = 0; j             if ((i >> j & 1) ==0)
                ;
            그렇지 않으면{
                휴식;
            }
        }
        n을 반환;       
    },
    updateCandidates: 함수 () {
        for (this.fixed의 var i) {
            var opt = 0x1FF ^ this.cell[this.fixed[i]];
            for (var j = 0; j                 this.cell[this.getX(this.fixed[i])[j]] &= 선택;
                //!알림
                if (this.cell[this.getX(this.fixed[i])[j]] == 0) {
                    //console.log("오류-0 후보:" x[this.fixed[i]][j]);
                    false를 반환합니다.
                }
            }
        }
        true를 반환합니다.
    },
    eekUniqueCandidate: 함수 () {
        for (this.blank의 var bidx) {
            var 행 = 0, 열 = 0, 상자 = 0;
            for (i = 0; i                 행 |= this.cell[this.getX(this.blank[bidx])[i]];
                상자 |= 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;
                계속;
            }
            if (this.bitCount(this.cell[this.blank[bidx]] & ~col) == 1) {
                this.cell[this.blank[bidx]] &= ~col;
                계속;
            }
            if (this.bitCount(this.cell[this.blank[bidx]] & ~box) == 1) {
                this.cell[this.blank[bidx]] &= ~box;
            }
        }
    },
    검색Filledable: 함수 () {
        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("고정됨:" this.blank[i] "=>" this.cell[this.blank[i]]);
                //this.blank.splice(i, 1);//루프에서 삭제하면 버그가 발생합니다
    _del.push(i);
            }
        }
  while(_del.length>0){
   this.blank.splice(_del.pop(), 1);
  }
    },
    eekMutexCell: 함수 () {
        var 2 = [];
        for (this.blank의 var n) {
            if (this.bitCount(this.cell[this.blank[n]]) == 2) {
                two.push(this.blank[n]);
            }
        }
        for (var i = 0; i             for (var j = i 1; 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                             this.cell[this.getX(two[i])[n]] &= 선택;
                        }
                    }
                    if ((two[i] - two[j]) % 9 == 0) {                      
                        for (n = 8; n                             this.cell[this.getX(two[i])[n]] &= 선택;
                        }
                    }
                    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                             this.cell[this.getX(two[i])[n]] &= 선택;
                        }
                    }
                    this.cell[two[j]] = ~opt;
                }
            }
        }
    },
    basicSolve: 함수 () {
        하세요 {
            if (!this.updateCandidates(this.fixed)) {
                this.backForward();
            }
            this.seekUniqueCandidate();
            this.seekMutexCell();
            this.seekFilledable();
        } while (this.fixed.length != 0);
        return this.blank.length == 0;
    },   
    setTrialCell: 함수() {
        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 waitValue = 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], waitValue, this.cell));
                true를 반환합니다.
            }
        }
        false를 반환합니다.
    },
    뒤로앞으로: function() {
        if (this.trials.length==0) {
            console.log("해결책이 없을 수도 있습니다!");
            반품;
        }
        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));
    },
    재설정: 함수(데이터) {
        this.blank=[];
        this.fixed=[];
        this.cell=data.concat();
        for (var i = 0; i             if (this.bitCount(this.cell[i]) != 1) {
                this.blank.push(i);
            } 그 밖의 {
                this.fixed.push(i);
            }
        }
    },
    trialSolve: 함수() {
        while (this.blank.length!=0) {
            if (this.setTrialCell()) {
                this.basicSolve();
            } 그 밖의 {
                if (this.trials.length==0) {
                    //console.log("뒤로 갈 수 없습니다! 해결책이 없을 수도 있습니다!");
                    휴식;
                } 그 밖의 {
                    this.backForward();
                    this.basicSolve();
                }
            }
        }
    },
    재생: 함수() {
        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("[" (끝 - 시작) "ms OK!]");
        } 그 밖의 {
            console.log("[" (end - start) "ms, 문제를 해결할 수 없나요?");
        }
  //return this.showBoard();
    },
    getX:함수(idx){
        var neighbor=new Array(24);
        var box=new 배열(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)계속;
            이웃[i ]=r*9 n;
        }
        for(var n=0;n<9;n ){
            if(n==r)계속;
            이웃[i ]=c n*9;
        }
        for(var n=0;n<9;n ){
            var t=xs 상자[n];
            if(t==idx)continue;
            이웃[i ]=t;
        }
          이웃을 돌려보내세요;
    },
 createTrialPoint:함수(idx, val, 보드) {
        var tp = {};
        tp.idx = idx;
        tp.val = 발;
        tp.data =board.concat();
        tp를 돌려주세요;
 }
};
//Sudoku.init("000000500000008300600100000080093000000000020700000000058000000000200017090000060");
//Sudoku.init("530070000600195000098000060800060003400803001700020006060000280000419005000080079");
Sudoku.init("800000000003600000070090200050007000000045700000100030001000068008500010090000400");
Sudoku.play();

以上就是关于使는javascript实现数独解법적전체부대码了,希望大家能够喜欢。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿