八皇后问题:要求在8x8的国际棋盘上摆放8个皇后,且每个皇后不与其他皇后处于同一行,同一列,同一斜线上。
求解思路:
- 在棋盘(1,1)这个位置开始摆放第一个皇后,依顺序摆放直到放完(1,8)这个位置,结束循环
- 在第前一轮的皇后(i,j)摆放完后,立刻进入下一轮在(i+1)行找到符合条件的位置摆放皇后
- 如果无法在(i+1)行找到符合条件的位置,则返回到上一轮循环,继续测试j-8之间的位置
- 每次在第8行成功摆放后,立刻输出一个解
代码编写思路:
- 创建一个一维数组用于存储某一轮的结果,数组的索引值+1表示第多少行,对应的值表示第多少列
- 创建一个计数器用来统计结果数
- 创建一个方法用来判断给定的位置是否符合条件
- 创建一个输出函数用来输出所有解的结果
主循环:
public int queenEight(int[] val,int n,int num) {
for (int i = 1; i <= 8; i++) {
boolean flag =jud(n+1, val, i);
if(n==0) {
val[0] =i;
num=queenEight(val,n+1,num);
}else if(n>0 && n<8 && flag){
val[n] =i;
num=queenEight(val, n+1,num);
if(n==7) {
num++;
printAn(val, num);
}
}else {
continue;
}
}
return num;
}
判断函数
public boolean jud(int y,int[] val,int x) {
boolean passWay = true;
for (int i = 0; i <y-1; i++) {
int y0 = i+1;
int x0 = val[i];
boolean flag1 =abs(x-x0)!=abs(y-y0) ;
boolean flag2 = x!=x0;
if(flag1 && flag2) {
continue;
}else {
passWay = false;
break;
}
}
return passWay;
}
输出函数
//输出八皇后问题的答案
public void printAn(int [] val,int num) {
System.out.println("========这是第"+num+"组解=======");
for (int i = 0; i < val.length; i++) {
System.out.println(String.format("第%s行的第%s列摆放第%s个皇后",(i+1),val[i],(i+1)));
}
}
结果:
输出最终结果共92种解。