递归回溯解决八皇后问题

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codewen77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值