zoukankan      html  css  js  c++  java
  • 每天一道算法题(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种解法

  • 相关阅读:
    02-zabbix安装部署
    01-zabbix服务说明
    00-ContOS 7.5编译安装MySQL-5.7.30
    bitset习题
    数颜色[分块]
    旋转子段 (思维stl)
    双栈排序(洛谷P1155)二分图的判定+思维贪心
    常见的系统获取唯一码方式
    SHELL-数组
    Prometheus-alertmanager组件使用
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392968.html
Copyright © 2011-2022 走看看