学生写的java版本的Javascript版本,第一次写,很不专业,了解。嗯,我有很多休闲。

复制代码代码如下所示:

var数独= {

init:函数(STR){

this.blank = { };

this.fixed = { };

this.cell = { };

这个,审判= {;

对于(i = 0;i < 81;i + +){

VaR CHR = str.charcodeat(我);

如果(CHR = = 48){

这个单元格{ } = 511;

This.blank.push(我);

{人}

这个细胞{我} = 1 << CHR 49;

This.fixed.push(我);

}

}

},

showboard:函数(){

var;

对于(var i = 0;i < 81;i + +){

如果(i % = 9 = 0){

板= board.concat(;

}

Board = board.concat ({);

对于(var j=0;j<9;j + +){

如果((这个单元格{ i } j 1)= 1){

板= board.concat(String.fromCharCode(j + 49));

}

}

板= board.concat(});

}

滑板;

},

检查:函数(){

var检查点{ 0, 12, 24,28, 40, 52,56, 68, 80 };

对于(检查点中的var i){

var,b,c;

r = b =;

对于(j = 0;j<8;j + +){

C ^这个细胞{ this.getx(检查{ } { } }){J}.;

B ^这个细胞{ this.getx(检查{我}){ 8 } } + J;

R ^这个细胞{ this.getx(检查{我}){ 16 } } + J;

}

如果((r,b)c)!= 0x1ff){

返回false;

}

}

返回true;

},

BitCount:(我){函数

var = 0;

对于(var j=0;j<9;j + +){

如果((i j 1)= 1)

氮+;

}

返回N;

},

numberoftrailingzeros:功能(我){

var = 0;

对于(var j=0;j<9;j + +){

如果((> j = 1)= 0)

氮+;

别的{

打破;

}

}

返回N;

},

updatecandidates:函数(){

对于(在这个固定的var i){

VaR选择= 0x1ff ^这个细胞{ } } {我固定;

对于(var j=0;j<24;j + +){

这个细胞{ this.getx(这个固定{ } { } } =选择){J}.;

通知!

如果(这个细胞{ this.getx(这个固定{ } { } } = =),0){

/ / console.log(error-0候选人:X { } { },{我固定J });

返回false;

}

}

}

返回true;

},

seekuniquecandidate:函数(){

对于(VAR bidx这个空白){

var行= 0,= 0,框= 0;

对于(i = 0;i < 8;i + +){

行本。细胞{ this.getx(这个空白bidx } { } }){我| =;

箱| =这。细胞{ this.getx(这bidx。空白{ }){ 8 +我} };

Col | =这。细胞{ this.getx(这bidx。空白{ }){ 16 +我} };

}

如果(this.bitcount(这个细胞{ } { }。空白bidx ~排)= = 1){

这个细胞{ } } = { bidx。空白~排;

继续;

}

如果(this.bitcount(这个细胞{ } { }。空白bidx ~ COL)= = 1){

这个细胞{ } } = { bidx。空白~ Col;

继续;

}

如果(this.bitcount(这个细胞{ } { }。空白bidx ~盒)= = 1){

这个细胞{ } } = { bidx。空白~盒;

}

}

},

seekfilledable:函数(){

this.fixed = { };

无功_del = { };

对于(在这个空白中的var i){

如果(this.bitcount(这个细胞{ } } {我。空白)= = 1){

This.fixed.push(这个空白{我});

/ / console.log(固定+这空白{我} +>+本。细胞{ } } {我。空白);

/ / this.blank.splice(I,1); / /回路中删除它会导致错误

_del.push(我);

}

}

而(_del。长> 0){

this.blank.splice(_del.pop(),1);

}

},

seekmutexcell:函数(){

var = { };

对于(在这个空白中的var){

如果(this.bitcount(这个细胞{这空白{N } })= = 2){

Two.push(这个空白{ });

}

}

对于(var i = 0;i < two.length;i++){

对于(var j = i + 1;J < two.length;j++){

如果(这个单元格{两个{ } } =这个单元格{ { } }){

这个单元格{ { } };

如果(parseInt(两{我} / 9)= = parseInt(两{ J } / 9)){

对于(n=0;n<8;n + +){

这个细胞{ this.getx(两{ } { } } =选择);

}

}

如果((两个{ } -两个{ })% 9 = 0){

对于(n=8;n<16;n + +){

这个细胞{ this.getx(两{ } { } } =选择);

}

}

如果((parseInt(两{我} / 27)* 3 + parseInt(两{我} % 9 / 3)=(parseInt(){ } 两J / 27)* 3 + parseInt(两{ J } % 9 / 3))){

对于(n=16;n<24;n + +){

这个细胞{ this.getx(两{ } { } } =选择);

}

}

这个单元格{;

}

}

}

},

BasicSolve:函数(){

{做

如果(!This.updateCandidates(这个固定)){

This.backForward();

}

this.seekuniquecandidate();

This.seekMutexCell();

this.seekfilledable();

}而(this.fixed.length!= 0);

返回this.blank.length = = 0;

},

settrialcell:函数(){

对于(var i在这空白){

如果(this.bitcount(这个细胞{ } } {我。空白)= = 2){

无功trialvalue = 1 < this.numberoftrailingzeros(这个细胞{ } } {我。空白);

无功waitingvalue =这。细胞{ } } {我。空白^ trialvalue;

/ / console.log(试试:{+这空白{我} +} - >+(this.numberoftrailingzeros(trialvalue)+ 1)+# (this.numberoftrailingzeros(waitingvalue)+ 1));

这个细胞{ } } = {我。空白trialvalue;

This.trials.push(this.createtrialpoint(这个空白{我},waitingvalue,这个细胞));

返回true;

}

}

返回false;

},

反向:函数(){

如果(这个测试=长度= 0){

console.log(也许无解!;

返回;

}

VaR模型后= this.trials.pop();

this.reset(回来的数据);

这个细胞{ } = back.val IDX回来;

This.fixed.push(回来。IDX);

/ / console.log(回:{+ +back.idx } - >+(this.numberoftrailingzeros(回来。Val)+ 1));

},

重置:函数(数据){

这个空白= { };

这个,固定= { };

这data.concat细胞=();

对于(var i = 0;i < 81;i + +){

如果(this.bitcount(这个细胞{我})!= 1){

This.blank.push(我);

{人}

This.fixed.push(我);

}

}

},

trialsolve:函数(){

而(this.blank.length!= 0){

如果(this.settrialcell()){

This.basicSolve();

{人}

如果(这个测试=长度= 0){

/ / console.log(不能向!也许没有解决办法!;

打破;

{人}

This.backForward();

This.basicSolve();

}

}

}

},

播放:函数(){

console.log(this.showboard());

VaR开始=新的日期()GetMilliseconds();

如果(!This.basicSolve()){

This.trialSolve();

}

var =新的日期()GetMilliseconds();

console.log(this.showboard());

如果(this.check()){

console.log({+(端开始)+ 好!}

{人}

console.log({+(端开始)+ ,不能解决它);

}

/ /返回this.showboard();

},

GetX:功能(IDX){

var =新数组(24);

VaR箱=新的数组(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;

对于(var = 0;n<9;n + +){

如果(n = C)继续;

邻居{ + + } = R * 9 + n;

}

对于(var = 0;n<9;n + +){

如果(n = r)继续;

邻居{ ++ 9;

}

对于(var = 0;n<9;n + +){

var t = X +盒{ };

如果(T = = IDX)继续;

邻居{;

}

返回的邻居;

},

createtrialpoint:功能(IDX,Val,板){

var;

tp.idx = IDX;

tp.val = val;

tp.data = board.concat();

返回TP;

}

};

/ / sudoku.init(000000 500000008300600100000080093000000000020700000000058000000000200017090000060 );

/ / sudoku.init(530070000600195000098000060800060003400803001700020006060000280000419005000080079 );

Sudoku.init(800000000003600000070090200050007000000045700000100030001000068008500010090000400 );

Sudoku.play();



以上是关于利用javascript实现数独的所有代码的解决方案,希望大家能喜欢它。