回溯法——8皇后问题

回溯法——8皇后问题

一、实验内容

1.问题描述
要求用回溯法求解8 —— 皇后问题,是放置在8*8棋盘上的8个皇后彼此不收攻击,即:任何两个皇后都不在同一行、同一列和同一斜线上。
请输出8皇后问题所有可行解。
2、要求
(1)写出问题分析过程
(2)写出程序代码
(3)写出程序运行结果

在这里插入图片描述
二、程序代码


package huisu;

public class Queen {

	/*
	 * 一共有多少个皇后(此时设置为8皇后在8*8棋盘,可以修改此值为N皇后
	 */
	int max= 8;
	static long sum=0;
	
	/*
	 * 该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列,
	 */
	int [] array = new int[max];
		
	public static void main(String[] args) {
		new Queen().check(0);
		System.out.println("一共有:"+sum+"个可行解");
		
	}
	
	/*
	 * n代表当前是第几个皇后
	 * @param n
	 * 皇后n在array[n]列
	 */
	private void check(int n) {
		//终止条件是最后一行已经摆完,由于每摆一步都会教研是否有冲突,所以就进行下一行逻辑
		
		if(n==max)
		{
			sum++;
			print();
			return;
		}
		for(int i=0;i<max;i++)
		{
			array[n] = i;
			if(judge(n)) {
				check(n+1);
			}
		}
	}
	
	private boolean judge(int n) {
		for(int i=0;i<n;i++)
		{
			if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i] )) {
				return false;
			}
		}
		return true;
	}
	
	private void print() {
		for(int i=0; i < array.length;i++)
		{
			System.out.print(array[i]+1+" ");
		}
		
		System.out.println();
		
	}

}

三、程序运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

简 。单

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

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

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

打赏作者

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

抵扣说明:

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

余额充值