算法-八皇后问题

个人博客原文链接

问题简述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当n2=1或n1≥4时问题有解。

解决方案一:递归
思路分析:
定义num来控制皇后的个数,初始设置为8
定义count来计数,计算问题的解决方案总数
定义数组array[num]来存储每一组方案的结果
定义查找方法find(int n),参数n代表当前放的是第几个皇后,n从0开始
在find中调用输出方法print(),每查找到一组结果就打印输出
在find中调用判断方法judge(int n),判断第n个皇后的当前列和对角线上是否有其它皇后
如果没有,在find中递归查找下一个皇后的位置,查找结束就开始循环查找下一组
最后在main方法中调用find方法即可

代码实现:

/**
 * 八皇后——>n皇后
 * 描述:在8X8棋盘放8个皇后,任何一个皇后都无法直接吃掉其他的皇后,问一共有多少种方法
 * 时间:2018-7-21 16:47:11
 * @author LousenJay
 *
 */

public class Queen {
	private int num = 8;	//设置皇后的个数
	public static int count = 0; //计数
	private int[] array = new int[num]; //保存结果,第一个皇后在array[0],第二个在array[1]
	
	/**
	 * 打印结果
	 */
	private void print(int n){
		//打印一组结果
		System.out.println("第"+n+"组:");
		for (int i = 0; i < num; i++) {
			System.out.print(array[i]+1+" ");
		}	
		System.out.println();//换行
		System.out.println("棋盘展示:");
		for (int i = 0; i < num; i++) { //打印行
			for (int j = 0; j < num; j++) { //打印列
				if(j == array[i]){
					System.out.print("♛");
				}else{
					System.out.print("☒");
				}
			}
			System.out.println();
		}
		System.out.println();
	}
	
	/**
	 * 判断第n行的皇后在当前列和对角线上是否有皇后
	 * 如果有则返回false,循环下一个列继续匹配
	 * 如果该列符合则返回true,开始下一行查找
	 * @param n
	 * @return
	 */
	private boolean judge(int n){
		for (int i = 0; i < n; i++) {
			//判断第n行的皇后在当前列和对角线上是否有皇后
			if(array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * n代表当前放的是第几个皇后
	 * array[n]代表第n个皇后的列的位置
	 * @param n
	 */
	private void find(int n){
		/*如果皇后全部放完了,则计数并打印该种方法*/
		if(n == num){
			count++;//计数
			print(count);//输出
			return;
		}
		
		/*开始第一组查找,先从第一行的8个列开始查找,符合条件开始依次查找第二行,
		 * 八行全部符合条件,查找结束,计数+1并打印结果
		 * 不符合就开始查找第二组
		 * 最后所有结果全部查找完毕,跳出递归循环*/
		for (int i = 0; i < num; i++) {
			array[n] = i; //遍历每一列放置的八种可能,列
			if(judge(n)){ //行
				find(n+1); //递归查找第二列
			}
		}
		
	}
	
	public static void main(String[] args) {
		Queen q = new Queen();
		q.find(0); //从第一行开始查找
		System.out.println("总计:"+q.count+"种方法");		
	}
}

你可能感兴趣的:(算法)