递归回溯解决八皇后问题

问题引入:
在这里插入图片描述
解决思路: 先放置第一个皇后在第一行遍历,确定第一个皇后的列,然后利用递归放置下一个皇后到下一行,并且放置途中需要判断是否与之前放置的有冲突,直到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);
	}
}

结果:
在这里插入图片描述

发布了30 篇原创文章 · 获赞 8 · 访问量 1381

猜你喜欢

转载自blog.csdn.net/qq_43598193/article/details/104064862
今日推荐