0
点赞
收藏
分享

微信扫一扫

递归学习——八皇后问题:java实现

迎月兮 2022-04-24 阅读 80
java算法

八皇后问题简介

在这里插入图片描述

代码实现

public class Queen8 {

	// 皇后的位置数组
	private static int[] queen;
	// 计算有多少种解法
	private static int count;
	// 棋盘的大小
	private static int maxSize = 8;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 初始化皇后数组
		queen = new int[maxSize];
		set(0);// 从第一行第一列的位置开始放皇后
		System.out.printf("共有%d种解法:",count);
	}

	
	// 判断当前第n个皇后是否和前几个皇后位置冲突
	public static boolean judge(int n) {
		for (int i = 0; i < n; i++) {
			// queen[i] == queen[n]表示判断 第n个皇后是否和前i个皇后在同一列
			// Math.abs(n - i) == Math.abs(queen[n] - queen[i])表示判断 第n个皇后是否和前i个皇后在同一条斜线
			if (queen[i] == queen[n] || Math.abs(n - i) == Math.abs(queen[n] - queen[i])) {
				return false;
			}
		}
		return true;
	}
	
	// 放置每一个皇后的位置
	public static void set(int n) {
		if (n  == maxSize) {
			// 已经放完了所有的皇后 
			// 打印解法 退出程序
			print();
			return;
		}
		for (int i = 0; i < queen.length; i++) {
			// 将当前皇后放在i号位置
			queen[n] = i; 
			// 判断当前第n个皇后是否和前i个皇后位置冲突
			if (judge(n)) {
				// 不冲突就放置第n+1个皇后
				set(n + 1);
			}
			// 冲突则返回上边的for循环继续去i+1个位置放置皇后
		}
	}
	
	// 打印八皇后的方法
	public static void print() {
		count++;
		for (int i = 0; i < queen.length; i++) {
			System.out.print(queen[i] + " ");
		}
		System.out.println();
	}
}

递归学习到这就结束了 最后吐槽一句:谁发明的递归 理解起来也太抽象了吧……

举报

相关推荐

0 条评论