N皇后问题--回溯法 (循环递归)

N皇后问题

问题描述:
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)

思路 (回溯法,循环递归):
0. 初始化棋盘(全部为0)
1. 依次将第一列棋子置为1
2. 放完棋子执行横向,纵向,斜向的update,把不能放棋子的位置置为2
3. 从第二列棋子开始,递归执行
4. 执行到最后一列,退出递归
5. 执行第一列的第二个棋子

实现:

var N = 4;

Array.prototype.count = function(c){
var count = 0;
for(var i = 0; i< this.length; i++){if(c(this[i])){count ++;}}
return count ;
}

//init map
var arr = new Array();
for(var i = 0 ;i < N;i ++){
var arr1 = new Array();
for(var j = 0;j < N; j++){arr1.push(0);}
arr.push(arr1);
}

var sln = new Array();
var queen = function q(col,done){

//find a vacancy
var zeroIndex = 0;

while(zeroIndex < N && arr[zeroIndex][col] != 0){zeroIndex ++;}

if(zeroIndex < N){
arr[zeroIndex][col] = 1;
//update positions
updatePosition(zeroIndex,col);
done ++;
}

if(col == N ){return ;}

/* debugging
console.log("arr : ");
for(var i = 0 ;i < arr.length; i++){
console.log (arr[i]);
}
*/

if(done == N-1){
var ar = new Array();
for(var i = 0 ;i < arr.length; i++){
var ar1 = new Array();
for(var j = 0;j < arr[i].length; j++){
ar1.push(arr[i][j]);
arr[i][j] = 0;
}
ar.push(ar1);
}
sln.push(ar);
}

col ++;
q(col,done);

}

var updatePosition = function (r,c){

// hor
for(var i = 0 ;i < c; i++){if(arr[r][i] == 0) {arr[r][i] = 2;}}
for(var i = c ;i < N; i++){if(arr[r][i] == 0) {arr[r][i] = 2;}}

//ver
for(var i = 0 ;i < r; i++){if(arr[i][c] == 0) {arr[i][c] = 2;}}
for(var i = r ;i < N; i++){if(arr[i][c] == 0) {arr[i][c] = 2;}}

//r+,c+; r-,c-
for(var i = r,j = c;i < N && j < N; i++, j++){if(arr[i][j] == 0){arr[i][j] = 2;}}
for(var i = r,j = c;i >=0 && j >= 0; i--, j--){if(arr[i][j] == 0){arr[i][j] = 2;}}

//r+,c-;r-,c+
for(var i = r,j = c;i < N && j >= 0; i++, j--){if(arr[i][j] == 0){arr[i][j] = 2;}}
for(var i = r,j = c;i >=0 && j < N; i--, j++){if(arr[i][j] == 0){arr[i][j] = 2;}}

}

for(var i = 0 ;i < N; i++){
arr[i][0] = 1;
updatePosition(i,0);
queen(1,0);
//console.log("================================");
for(var j = 0; j < arr.length; j++){for(var k = 0 ;k  <arr[j].length; k++){arr[j][k] = 0;}}
}

console.log("for " + N + " - " + N + " queen , solutions : ") ;
for(var i = 0 ; i< sln.length ;i++){
console.log("=========sln : " + (i+1) + "====================");
for(var j = 0; j < sln[i].length; j++){
console.log(sln[i][j].join(" "));
}

}

N皇后问题--回溯法 (循环递归)

时间: 2024-10-07 21:15:31

N皇后问题--回溯法 (循环递归)的相关文章

八皇后(回溯法)

题目内容 n*n的矩阵,作为棋盘,放置n个皇后,且它们都无法攻击其他皇后,求出放置方法 皇后的攻击方式,沿行.列.对角线都可以攻击其它皇后 基本思想 使用回溯法(穷举法) 所有的回溯问题都是由三个步骤组成:choose.explore.unchoose 因此对每个问题需要知道: choose what?   对于这个问题,我们选择每个字符串 how to explore?对于这个问题,我们对剩余的字符串做同样的事情. unchoose           做相反的操作选择 回溯法步骤 1.Def

算法入门经典-第七章 例题7-4-1 拓展 n皇后问题 回溯法

实际上回溯法有暴力破解的意思在里面,解决一个问题,一路走到底,路无法通,返回寻找另   一条路. 回溯法可以解决很多的问题,如:N皇后问题和迷宫问题. 一.概念 回溯算法实际类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现不满足条件的时候,就回溯返回,尝试别的路径. 百度解释:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯

八皇后问题-回溯法解

八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. int g_number = 0;? //多少种摆放方法?void EightQueen(){? ?const int queens = 8;? //棋盘大小?? ?int ColumnIndex[queens];? //列索引?//遍历行? ?for(int i = 0; i < queens; ++ i)?? ? ? ?ColumnIndex[i] = i;

八皇后问题-回溯法(matlab)

1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上. 2.matlab代码 function PlaceQueen(row,stack,N)%回溯法放置皇后 if row>N PrintQueen(N,stack);%打印棋盘 else for col=1:N stack(row)=col; if row==1||Conflict(row,col,N,stack)%检测是

8皇后问题--回溯法 (循环递归)

N皇后问题 问题描写叙述:N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自己主动攻击) 1.因为每一个棋子不可能同行.因此能够理解为从棋盘每行拿个棋子出来2.因为每列棋子也不同样,因此没有同一个数字能够在一个列3.综合1,2.问题转化为给[0-7]做全排列,然后满足没有两个数字在同一个斜线4.依据斜率公式 (x1-x2)/(y1-y2),因此依据这个条件排出同线的组合5.余下的组合即为每行棋子的列位置,索引,就是行号

八皇后之回溯法解决[转]

问题描述: 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉.规则是皇后能吃掉同一行.同一列.同一对角线的棋子.如下图即是两种方案: . 解决方案: 8*8的棋盘要摆放8个皇后,且不能同行同列同对角线,那么每行必定会有一个皇后.我们可以设一个数组a用来存放每一行皇后的位置,元素值表示第几列(如a[1]=5表示第一行的皇后处于第五个格).然后只需要求出数组a的值 问题就解决了,下面介绍三种回溯解法: 1.八个for循环.用枚举的办法,八个for循环分别枚举每一行的8个位置,但是我

八皇后问题——回溯法(python&amp;&amp;JAVA)

八皇后问题,是一个古老而著名的问题,问题如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 上边是一个8*8的国际棋盘,可以看到棋盘中的每个格子都标有数字.每个数字都是两位,十位数字表示该格子所在的行,而个位数字表示该格子所在的列. 这样不难发现,处在同一行的两个格子其十位数都相同,处在同一列的两个格子其个位数都相同,处在同一斜线的两个格子有:|两个数字个位数的差|=|两个数字十位数的差|. 主要的三个限制条件明白了

2、八皇后问题——回溯法

/** * */ package unit1; /** * @author * @version 创建时间:2015-10-30 下午02:55:24 类说明 */ public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 16, norm = squares - 1; private int positionInRow[] = new i

八皇后问题 回溯法

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo 8 { 9 class Program 10 { 11 static int num = 8;/*可以随意修改,num是多少解的就是几皇后问题*/ 12 static int[] arr = new int[8