八皇后问题
八皇后问题:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(92种)
思路
利用递归的方法先判断第一行第一列的所有正确解;之后再判断下一列,直到把所有解求出
其中的一种解法
可以用一维数组来表示每种解法棋子的位置,arr[8]={0,4,7,5,2,6,1,3}
package dataStructs.recursion;
public class Queue8 {
//定义一个max表示共有多少个皇后
int queen = 8;
//定义数组array,保存皇后放置位置的结果;此数组的下标表示行,下标对应的值表示列;
int[] result = new int[queen];
static int count = 0;
public static void main(String[] args) {
//测试
Queue8 queue8 = new Queue8();
queue8.checked(0);
System.out.printf("一共有%d种解法",count);
}
//放置第n个皇后
private void checked(int n){
if(n == queen){//n=8,表示第9个皇后,没有必要再放置
print();
return;
}
//依次放入皇后,并判断是否冲突
for (int i = 0; i < queen; i++){
//先把当前皇后,放到该行第一列
result[n] = i;
//判断该列是否冲突
if(judges(n)){ //不冲突
//继续放下一个,开始递归
checked(n+1);
}
//如果冲突,继续判断下一列是否冲突
}
}
//查看放置第n个皇后时,是否和前面已经摆放的皇后冲突
/**
*
* @param n 第2个皇后时,n=1;第1个皇后,n=0(这里默认棋盘是0~7)
* @return true:不冲突 false:冲突
*/
private boolean judges(int n){
for (int i = 0; i < n; i++){
//array[i]==array[n]:说明在同一列
/*Math.abs(n-i)==Math.abs(array[n]-array[i]):判断是否在同一斜线
* 因为只要在同一斜线,就说明这两个皇后位置所对应的行和列之差是相等的(即正方形)
*
* */
if (result[i]==result[n]||Math.abs(n-i)==Math.abs(result[n]-result[i])){
return false;
}
}
return true;
}
//将皇后摆放的位置输出
private void print(){
count++;
for (int i = 0; i <result.length; i++){
System.out.print(result[i]+" ");
}
System.out.println();
}
}
测试结果
共有92种解法