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;
    	}
    
    }
    

      

  • 相关阅读:
    日志到底该如何打印?
    消息摘要(MessageDigest)
    URL编码及解码原理
    AES简介
    MySQL中整型长度的意义
    keytool生成密钥
    证书类型及秘钥库
    Base64编码及解码原理
    Holistically-Nested Edge Detection 论文总结
    全新bili主题
  • 原文地址:https://www.cnblogs.com/yuanzhenliu/p/5031043.html
Copyright © 2011-2022 走看看