public class Main {
/*
* 问题描述:
* 八皇后问题:在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即八个皇后不能
* 处于同一行,同一列,或者同一斜线
* 问:一共有多少种解法(92)
/
/
* 问题思路:
* 本来要通过创建一个2维数组分别表示8个皇后的位。
* 这里进行优化,创建一个int[] val=new int[8] 一维数组
* val[0]=0,表示第(0+1)个皇后在第(0+1)列
*
*/
public static void main(String[] args) {
Queen8 queen=new Queen8();
queen.cheek(0);
System.out.println(“一共有”+Queen8.count+“种摆列的方法”);
}
}
class Queen8{
public int max=8;//皇后的个数
public int[] array=new int[8];//用来存放8个皇后的位置
public static int count=0;//用来计算八皇后问题一共有多少种解法
//当满足8皇后摆放的条件时,输入
public void print() {
count++;
for(int i=0;i<array.length;i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
//判断第n个皇后摆放的位置是否满足条件
public boolean isTrue(int n) {
for(int i=0;i<n;i++) {
/*
* 判断第n个皇后摆放的位置是否合理:
* 1.不在同一列 通过上面的for循环就可以使其不在同一行
* 2.array[i]==array[n] 可以是其不在同一列
* 3. Math.abs(n-i)==Math.abs(array[n]-array[i] 如果其相等,则这俩个皇后点所练成的
* 直线的斜率为1,就在同一条直线上
*/
if(array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])) {
return false;
}
}
return true;
}
//判断第n个皇后摆放的位置
public void cheek(int n) {
/*
* 如果n==8的话 就证明前8个都满足摆放条件,,所以就找到一种摆放情况,输出
*/
if(n==max) {
print();
return;
}
for(int i=0;i<max;i++) {//将第n个皇后从第1列开始到第8列开始遍历
array[n]=i;
if(isTrue(n)) {//如果第n个皇后满足摆放的条件,就去递归判断第n+1个皇后是否满足摆放条件
cheek(n+1);
}
}
}
}
结果: