回溯法解决八皇后问题---用Java语言

来源:互联网 发布:it测试工程师很苦吗 编辑:程序博客网 时间:2024/05/06 22:49

import java.lang.*;
import java.util.*;

class Queen {
 private int x;
 private int y;
  
 public void setX(int x){
   this.x=x;
 }
 public int getX(){
  return x;
 }
 public void setY(int y){
  this.y=y;
 }
 public int getY(){
  return y;
 }
 
}

public class EightQueen {
 private static List<Queen> qlist = new ArrayList<Queen>();
 private static List<Queen> finlist=new ArrayList<Queen>();
 private static int qsize=8;

 
 public static void main(String[] args){
   long start = System.nanoTime();
   backTrack(1,1);
   System.out.println("take time = "+(System.nanoTime()-start));
   int n=0;
   for(int i=0;i<finlist.size();i++){
    if(i%qsize==0){
     System.out.print((++n)+":");
    }
    Queen q=(Queen)finlist.get(i);
    System.out.print(q.getX()+","+q.getY()+" ");
    if((i+1)%qsize==0)
     System.out.println();
   }
 
 }
 
 public static boolean backTrack(int i,int j){/* 回溯法解决八皇后问题*/
   
   for(;j<=qsize;j++){
    boolean good=true;
    Iterator<Queen> it= qlist.iterator(); 
    while(it.hasNext()){
     Queen q = (Queen)it.next();
     int x=q.getX();
     int y=q.getY();
     if(i==x){
      good=false;  
      break;  
     }
     if(j==y){
      good=false;
      break;
     }
     if((j-y)==(i-x)||(j-y)==(x-i)){
      good=false;
      break;
     }
     
    }
    if(good == true){
     Queen queen = new Queen();
     queen.setX(i);
     queen.setY(j);
     qlist.add(queen);
     if(i==qsize){
       Iterator<Queen> its=qlist.iterator(); 
       while(its.hasNext()){
        finlist.add((Queen)its.next());
       }
       qlist.remove(queen);//用remove(i-1)应该也行
       qlist.remove(i-2);
       return true;
     }
     backTrack(i+1,1);
    }
   }
   if(i!=1){
    qlist.remove(i-2);
   }
   return false;
 }

}

原创粉丝点击