zoukankan      html  css  js  c++  java
  • 回溯法_皇后问题

    package backtrack;
    
    /*	回溯法求n皇后问题
     * 	先以4皇后为例,最后求出的解空间存在一个数组x[4]中
     * 	要解决皇后问题还得编制一个限界函数place();
    */
    public class BACKTRACK {
    	static int n=4;//这里可以修改皇后数目
    	static int[] x=new int[n];//存储解空间   
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		x[0]=0;//第0个皇后放在第0列
    		int k=0;
    		while (k>=0){
    			x[k]=x[k]+1;
    			while(x[k]<n&&!place(k)){
    				x[k]=x[k]+1;
    			}
    			if(x[k]<n){
    				 if(k==n-1){
    					 System.out.println();
    					 for(int i=0;i<n;i++){
    						 System.out.print(x[i]+" ");
    					 }
    					// return;
    				 }else{
    					 k=k+1;
    					 x[k]=-1;
    				 } 
    			}
    			else{
    				k=k-1;//回溯
    			}
    			}
    	}
    public static boolean place(int k){
    	int i=0;
    	while(i<k){
    		if(x[i]==x[k]||Math.abs(x[i]-x[k])==Math.abs(i-k)){
    			return false;
    		}
    		i=i+1;
    	}
    	return true;
    }
    
    }
    

      回溯法的递归实现:

    package backtrack;
    
    /*	回溯法求n皇后问题
     * 	先以4皇后为例,最后求出的解空间存在一个数组x[4]中
     * 	要解决皇后问题还得编制一个限界函数place();
    */
    public class RBACKTRACK {
    	static int n=4;//这里可以修改皇后数目
    	static int[] x=new int[n];//存储解空间	 	
    	public RBACKTRACK(){ 
    		int k=0;
    
    		rbacktrack(k);
    	}
    	public static void rbacktrack(int k){
    		if(k==n){//递归出口
    			for(int i=0;i<n;i++){
    				System.out.print(x[i]+"  ");
    			}
    			System.out.println();
    			return;
    		}
    		x[k]=0;//记得清零
    		while(x[k]<n){//记得在这里加while循环,这样才能够不断增加问题空间
    			if(place(k))
    				rbacktrack(k+1);
    			x[k]++;
    		}
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		RBACKTRACK rb=new RBACKTRACK();
    	}
    	public static boolean place(int k){
    		int i=0;
    		while(i<k){
    			if(x[i]==x[k]||Math.abs(x[i]-x[k])==Math.abs(i-k)){
    				return false;
    			}
    			i=i+1;
    		}
    		return true;
    	}
    
    }
    

      

  • 相关阅读:
    session
    php增删改查,分页
    sql题
    php简单的数据增删改查
    php简单登录注册验证
    js题
    jQHTML(获取内容和属性)
    jQ效果(动画)
    Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)
    POJ 2891 中国剩余定理(不互素)
  • 原文地址:https://www.cnblogs.com/yuanzhenliu/p/5031043.html
Copyright © 2011-2022 走看看