码迷,mamicode.com
首页 > 编程语言 > 详细

4皇后或者8皇后求解算法--------(N皇后求解算法,JS实现)

时间:2015-01-12 16:00:31      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!