标签:
1 var check = new CheckBoard(8);//初始化棋盘,为8皇后 2 check.getResult(0); //参数表示从第0步开始走 3 console.log(check.result.length);//所有符合条件的路径均保存在数组result中 //结果: 92 中解法 (---即8皇后问题有92种解法)
1 //n皇后问题 源代码 ----(JavaScript语言) 2 //定义每个节点的位置 3 var Node = function (i, j) { 4 this.i = i; 5 this.j = j; 6 } 7 //根据n生生成棋盘 8 9 var CheckBoard = function (n) { 10 this.check = [ 11 ]; 12 for (var i = 0; i < n; i++) { 13 var temp = [ 14 ]; 15 for (var j = 0; j < n; j++) { 16 var node = new Node(i, j); 17 temp.push(node); 18 } 19 this.check.push(temp); 20 } 21 this.n = n; 22 this.nodes = [ 23 ]; 24 this.result = [ 25 ]; 26 } 27 //检查路径上是够能够存在该点 28 29 CheckBoard.prototype.passable = function () { 30 var array = this.nodes; 31 //若数组中,存在同行,同列, 或通对角线的节点则返回false 32 var object1 = { 33 }, 34 object2 = { 35 }; //分别管理者行和列 36 for (var k = 0, length = array.length; k < length; k++) { 37 var i=array[k].i,j=array[k].j; 38 if ((!object1[i]) && (!object2[j])) { 39 object1[i] = true; 40 object2[j] = true; 41 } else { 42 return false; 43 } 44 } 45 //for 若到这一步,则证明不在同一行,也不在同一列 46 //判断是否在同一个对角线上 47 //判断是否在对角线上的原则,即为是否满足与所有点的组成的直线斜率绝对值是否为1 48 49 if (array.length > 1) { 50 var top = array[array.length - 1]; 51 for (var i = 0, length = array.length - 1; i < length; i++) { 52 var k = (top.j - array[i].j) / (top.i - array[i].i); //求得斜率 53 if (Math.abs(k) === 1) { 54 return false; 55 } 56 } 57 } 58 return true; 59 } 60 CheckBoard.prototype.getResult = function (i) { 61 //i代表正在走的某一步 62 if (i == this.n) { //当正在走第N步的时候,代表棋盘已经遍历一遍 63 var array = [ 64 ]; 65 for (var i = 0, length = this.nodes.length; i < length; i++) { 66 var index1 = this.nodes[i].i; 67 var index2 = this.nodes[i].j; 68 array.push(new Node(index1, index2)); 69 } 70 this.result.push(array); 71 } else { 72 for (var j = 0; j < this.n; j++) { 73 //将当前位置推入栈 74 this.nodes.push(this.check[i][j]); 75 if (this.passable()) arguments.callee(i + 1); 76 this.nodes.pop(); 77 } 78 } 79 }
4皇后或者8皇后求解算法--------(N皇后求解算法,JS实现)
标签:
原文地址:http://www.cnblogs.com/renlong0602/p/4218420.html