标签:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
(因JAVA部分知识的短缺,故有所参考自http://baike.baidu.com/view/622604.htm#sub698719)
1 public class Queen{//同栏是否有皇后,1表示有 2 private int[] column;//右上至左下是否有皇后 3 private int[] rup;//左上至右下是否有皇后 4 private int[] lup;//解答 5 private int[] queen;//解答编号 6 private int num; 7 8 public Queen(){ 9 column=new int[8+1]; 10 rup=new int[(2*8)+1]; 11 lup=new int[(2*8)+1]; 12 13 for(int i=1;i<=8;i++) 14 column[i]=0; 15 16 for(int i=1;i<=(2*8);i++) 17 rup[i]=lup[i]=0; //初始定义全部无皇后 18 19 queen=new int[8+1]; 20 } 21 22 public void backtrack(int i){ 23 if(i>8){ 24 showAnswer(); 25 } 26 else{ 27 for(int j=1;j<=8;j++){ 28 if((column[j]==0)&&(rup[i+j]==0)&&(lup[i-j+8]==0)){//若无皇后 29 queen[i]=j;//设定为占用 30 column[j]=rup[i+j]=lup[i-j+8]=1; 31 backtrack(i+1); //循环调用 32 column[j]=rup[i+j]=lup[i-j+8]=0; 33 } 34 } 35 } 36 } 37 38 protected void showAnswer(){ 39 num++; 40 System.out.println("\n解答"+num); 41 42 for(int y=1;y<=8;y++){ 43 for(int x=1;x<=8;x++){ 44 if(queen[y]==x){ 45 System.out.print("Q"); 46 } 47 else{ 48 System.out.print("."); 49 } 50 } 51 52 System.out.println(); 53 } 54 } 55 56 public static void main(String[]args){ 57 Queen queen=new Queen(); 58 queen.backtrack(1); 59 } 60 }
运行得出共有92种摆法。
标签:
原文地址:http://www.cnblogs.com/guolei740908/p/5880136.html