问题引入:
解决思路: 先放置第一个皇后在第一行遍历,确定第一个皇后的列,然后利用递归放置下一个皇后到下一行,并且放置途中需要判断是否与之前放置的有冲突,直到8个皇后放置完毕,这就是一种解法,然后回溯,回到第8行继续遍历看是否有其它解法,如果没有就继续回溯到第七行遍历,有的话就用递归找到下一行皇后放置的位置,没有就继续回溯
代码实现:
/**
* 八皇后问题
* 将八个皇后放置到8*8的国际棋盘上(每一行只能放一个),且皇后之间不能冲突(不能在同一行,同一列,同一条斜线上),有多少种摆法?
* @author codewen
*
*/
public class EightQueens {
//放置皇后的数组,n表示第几行的皇后
//(如n=0,queens[0]=0 表示第一个皇后放在第一行第一列 每一行都只有一个皇后),queens[n]表示皇后所在的列
private static int[] queens = new int[8];
private static int count = 0;//用于记录有多少种摆法
//判断当前这行皇后与前面几行的皇后是否冲突的方法
public static boolean isConflict(int n) {
for(int i=0; i<n; i++) {
//如果在同一列或在同一条斜线上(斜率为+1和-1 y2-y1=x2-x1)就说明冲突了
if(queens[i] == queens[n] || Math.abs(n-i) == Math.abs(queens[n]-queens[i])) {
return true;
}
}
return false;
}
//摆放第n(0-7)个皇后的方法
public static void putQueen(int n) {
if(n == 8) {//n=8时(0-7行的八个皇后都已摆放完毕),直接回溯
System.out.printf("第%d种是:",++count);
show();
return;
}
for(int i=0; i<8; i++) {//找到第n个皇后合适的列
queens[n] = i;
if(!isConflict(n)) {//如果不冲突 递归找到下一行皇后合适的列
putQueen(n+1);
}
}
}
//显示一种摆法的方法
public static void show() {
for (int i : queens) {
System.out.print(i+" ");
}
System.out.println();
}
public static void main(String[] args) {
putQueen(0);
}
}
结果: