8皇后问题:
8*8的国际象棋中,摆8个皇后,任意两个皇后之间都不会处于同一行,同一列或者是同一斜线上,问有多少中摆法?
思路:
- 第一个换后先放在第一行第一列
- 第二个皇后放在第二行的第一列开始,判断是否可行,如果不可行,则继续放在第二列,第三列。。。直到找到合适的位置
- 继续放置第三个皇后,如同步骤2
- 当得到一个正确解的时候,递归中的栈退回到上一个栈时,就会开始回溯,即将第一个皇后放在第一列的所有正确解得到
- 然后回头继续将第一个皇后放在第二列,。。。后面陆续执行2345678列
代码
public class Queue {
int maxSize=8;//皇后的数量
int[] array=new int[maxSize];//array[i]表示第i行第array[i]列
static int count=0;//多少种解法
public static void main(String[]args) {
Queue queue=new Queue();
queue.check(0);//从0开始放
System.out.println("共有"+count+"种结果");
}
private void check(int n) {
if(n==maxSize) {
//表示已经到放置第九个(0-8)
printf();
count++;
return;
}
for(int i=0;i<maxSize;i++) {
array[n] = i;//先把当前这个皇后 n , 放到该行的第1列,array[n]==i表示从第1列开始,i初始值为0
//判断当放置第n个皇后到第i列的时候,会不会冲突
if(judge(n)) {
//如果不冲突,就放置下一个皇后
check(n+1);
}
//如果冲突,i++
}
}
//判断皇后的位置是否可以放置
/**
*
* @param n表示第n个皇后
* @return
*/
private boolean judge(int n) {
for(int i=0;i<n;i++) {
//(array[i]==array[n]表示两个皇后在同一列 array[i]表示第array[i]列
//Math.abs(i-n)==(Math.abs(array[i]-array[n]))表示两个皇后在同一斜线上
if(array[i]==array[n]||Math.abs(n-i)==(Math.abs(array[n]-array[i]))) {
return false;
}
}
return true;
}
//输出结果方法
private void printf() {
for(int i=0;i<array.length ;i++) {
System.out.printf(array[i]+" ");
}
System.out.println();
}
}