javascript实现数独解法_javascript技巧
生生把写过的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 this.fixed.push(i);
}
}
},
显示板:函数 () {
var board = "";
for (var i = 0; i if (i % 9 == 0) {
board = board.concat("n");
}
board = board.concat("[");
for (var j = 0; j if ((this.cell[i] >> j & 1) == 1) {
board = board.concat(String.fromCharCode(j 49));
}
}
board = board.concat("]");
}
返回板;
},
检查:函数 () {
var 检查点 = [0, 12, 24, 28, 40, 52, 56, 68, 80];
for (检查点中的 var i) {
var r, b, c;
r = b = c = this.cell[检查点[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) {
返回错误;
}
}
返回真;
},
位计数:函数 (i) {
var n = 0;
for (var j = 0; j if ((i >> j & 1) == 1)
n ;
}
返回 n;
},
numberOfTrailingZeros: 函数(i){
var n = 0;
for (var j = 0; j if ((i >> j & 1) ==0)
n ;
其他{
休息;
}
}
返回n;
},
updateCandidates: function () {
for (var i in this.fixed) {
var opt = 0x1FF ^ this.cell[this.fixed[i]];
for (var j = 0; j this.cell[this.getX(this.fixed[i])[j]] &= opt;
//!注意
if (this.cell[this.getX(this.fixed[i])[j]] == 0) {
//console.log("Error-0候选:" x[this.fixed[i]][j]);
返回错误;
}
}
}
返回真;
},
eekUniqueCandidate: 函数 () {
for (var bidx in this.blank) {
var 行 = 0,列 = 0,框 = 0;
for (i = 0; i row |= 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;
}
}
},
eekFilledable: 函数 () {
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);//在循环中删除它会导致bug
_del.push(i);
}
}
while(_del.length>0){
this.blank.splice(_del.pop(), 1);
}
},
eekMutexCell: 函数 () {
var 二 = [];
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
var opt = ~this.cell[two[i]];
if (parseInt(two[i] / 9) ==parseInt(two[j] / 9)) {
对于 (n = 0; n this.cell[this.getX(two[i])[n]] &= opt;
}
}
if ((二[i] - 二[j]) % 9 == 0) {
对于 (n = 8; 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) ))){
对于 (n = 16; n this.cell[this.getX(two[i])[n]] &= opt;
}
}
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: function() {
for (var i in this.blank) {
if (this.bitCount(this.cell[this.blank[i]]) == 2) {
var 试验值 = 1 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.trys.push(this.createTrialPoint(this.blank[i], waitingValue, this.cell));
返回真;
}
}
返回错误;
},
向后:函数(){
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("[" (end - start) "ms OK!]");
} 其他 {
console.log("[" (end - start) "ms,无法解决?");
}
//返回this.showBoard();
},
getX:函数(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 if(n==c)继续;
邻居[i]=r*9 n;
}
for(var n=0;n if(n==r)继续;
邻居[i]=c n*9;
}
for(var n=0;n var t=xs box[n];
if(t==idx)继续;
邻居[i]=t;
}
返回邻居;
},
createTrialPoint:function(idx, val, board) {
var tp = {};
tp.idx = idx;
tp.val = val;
tp.data = board.concat();
返回 tp;
}
};
//数独.init("000000500000008300600100000080093000000000020700000000058000000000200017090000060");
//数独.init("530070000600195000098000060800060003400803001700020006060000280000419005000080079");
数独.init("800000000003600000070090200050007000000045700000100030001000068008500010090000400");
数独.play();
以上就是关于使用javascript实现数独解法的全部代码了,希望大家能够喜欢。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

如何使用WebSocket和JavaScript实现在线语音识别系统引言:随着科技的不断发展,语音识别技术已经成为了人工智能领域的重要组成部分。而基于WebSocket和JavaScript实现的在线语音识别系统,具备了低延迟、实时性和跨平台的特点,成为了一种被广泛应用的解决方案。本文将介绍如何使用WebSocket和JavaScript来实现在线语音识别系

WebSocket与JavaScript:实现实时监控系统的关键技术引言:随着互联网技术的快速发展,实时监控系统在各个领域中得到了广泛的应用。而实现实时监控的关键技术之一就是WebSocket与JavaScript的结合使用。本文将介绍WebSocket与JavaScript在实时监控系统中的应用,并给出代码示例,详细解释其实现原理。一、WebSocket技

如何利用JavaScript和WebSocket实现实时在线点餐系统介绍:随着互联网的普及和技术的进步,越来越多的餐厅开始提供在线点餐服务。为了实现实时在线点餐系统,我们可以利用JavaScript和WebSocket技术。WebSocket是一种基于TCP协议的全双工通信协议,可以实现客户端与服务器的实时双向通信。在实时在线点餐系统中,当用户选择菜品并下单

如何使用WebSocket和JavaScript实现在线预约系统在当今数字化的时代,越来越多的业务和服务都需要提供在线预约功能。而实现一个高效、实时的在线预约系统是至关重要的。本文将介绍如何使用WebSocket和JavaScript来实现一个在线预约系统,并提供具体的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工

JavaScript和WebSocket:打造高效的实时天气预报系统引言:如今,天气预报的准确性对于日常生活以及决策制定具有重要意义。随着技术的发展,我们可以通过实时获取天气数据来提供更准确可靠的天气预报。在本文中,我们将学习如何使用JavaScript和WebSocket技术,来构建一个高效的实时天气预报系统。本文将通过具体的代码示例来展示实现的过程。We

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用于在DOM树中插入一个新的节点。这个方法需要两个参数:要插入的新节点和参考节点(即新节点将要被插入的位置的节点)。

JavaScript是一种广泛应用于Web开发的编程语言,而WebSocket则是一种用于实时通信的网络协议。结合二者的强大功能,我们可以打造一个高效的实时图像处理系统。本文将介绍如何利用JavaScript和WebSocket来实现这个系统,并提供具体的代码示例。首先,我们需要明确实时图像处理系统的需求和目标。假设我们有一个摄像头设备,可以采集实时的图像数
