数码资讯
数独解决方案的javascript实现
学生写的java版本的Javascript版本,第一次写,很不专业,了解。嗯,我有很多休闲。 复制代码代码如下所示: var数独= { init:函数(STR){ this.blank = { }; this.fixed = { }; this.cell = { }; 这个,审判= {; 对于(i
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
学生写的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实现数独的所有代码的解决方案,希望大家能喜欢它。
复制代码代码如下所示:
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实现数独的所有代码的解决方案,希望大家能喜欢它。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。