首页 > 代码库 > 八皇后问题

八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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种摆法。

八皇后问题