码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2016-09-18 01:05:01      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!