每天一道算法题(36)——8皇后问题

题目

    要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。求一种解法。

思路

        (1)递归法。以列数为状态,每一行的棋子共有8种状态。对每一棋子,依次遍历8种状态,在符合规则的状态下进行递归。

        (2)深度优先遍历法。类似于递归法,对于每一层棋子,倘若符合规则,则前进;不符合规则且状态已经不能更新,则回溯,若状态还能更新,则更新状态。

        在符合规则的情况下,若找出一种解,则打印该解,并且回溯。每一次回溯,均需要使用循环返回最顶层那个还能更新状态的棋子,并更新该棋子的状态。


代码:

public class eightQueen {
	int N;
	int[] index;
	int solution;
	eightQueen(int n){
		N=n;
		index=new int[N];
		for(int i=0;i<N;i++)
			index[i]=0;
		solution=0;
	}
	public boolean decision(int in){//判决,不在同一行和同一列和不在对角线上
		for(int i=0;i<in;i++)  
	    {  
	        if(Math.abs(index[i]-index[in])==Math.abs(i-in) || index[i]==index[in])  
	            return false;  
	    }
		return true;
	}
	
	public void print(){//打印
		System.out.println("Solution:"+solution+"----------------------");
		for(int i=0;i<N;i++){
			for(int k=0;k<N;k++)
				if(k==index[i])
					System.out.print(1);
				else
					System.out.print(0);
			System.out.print('
');
		}
	}
	
	
	public void find1(int i){//递归法解决八皇后问题
		for(int j=0;j<N;j++){
			index[i]=j;
			if(decision(i)){
				if(i==N-1){
					solution++;
					print();
				}
				else
				    find1(i+1);
			}
		}
	}
	
	
	public void find2(){//深度遍历之回溯法解决八皇后问题
		int i=0;
		while(i>=0)
		{
			if(decision(i)){//确定当前节点的状态是否满足
				if(i==N-1){
					solution++;
					print();
					
					/*************找到一个解,回溯***************/
					index[i]=0;
					i--;
					while(i>=0&&index[i]==N-1){
						   index[i]=0;
						   i--;//回溯
					}
					if(i>=0)
						index[i]++;//更新最上一层还可以更新状态的节点的状态
				}
				else{//前进过程
					i++;
				}
			}
			else if(index[i]==N-1){//某个节点的状态已经无法更新,回溯
				while(i>=0&&index[i]==N-1){//回溯至最上一层的点
					   index[i]=0;
					   i--;
				}
				if(i>=0)
					index[i]++;////更新最上一层还可以更新状态的节点的状态
		   }
			else//节点状态更新
				index[i]++;
			
	 }
   }
}

解析:当前节点状态是否满足:

                  满足:是到到达最后一层,输出,并回溯至能更新状态的最近一层

                               没有到达最后一层,更新至判断下一层

                  不满足且当前层状态已经无法更新:

                              更新至能更新的最近一层

                 不满足且当前曾状态还能更新

                             更新状态。




8皇后问题共有92种解法

原文地址:https://www.cnblogs.com/engineerLF/p/5392968.html