倪佳庆

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。八皇后问题就是在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

用遍历的思想,可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的位置,接着就到下一行或列遍历下一个棋子的合适位置。

public class Queen8 {
        public static int num = 0;    //累计方案总数  
        public static final int MAXQUEEN = 8;    //皇后个数,同时也是棋盘行列总数  
        public static int[] cols = new int[MAXQUEEN];     //定义cols数组,表示8列棋子摆放情况  
        public Queen8() {    
        //核心函数  
          getArrangement(0);  
          System.out.println("/n");  
          System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。");  
        }    
        public void  getArrangement(int n){  
         //遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true  
         boolean[] rows = new boolean[MAXQUEEN];  
         for(int i=0;i<n;i++){  
            rows[cols[i]]=true;  
            int d = n-i;  
            if(cols[i]-d >= 0)rows[cols[i]-d]=true;  
            if(cols[i]+d <= MAXQUEEN-1)rows[cols[i]+d]=true;     
         }  
         for(int i=0;i<MAXQUEEN;i++)  //判断该行是否合法 
         {                             
           if(rows[i])continue;  //设置当前列合法棋子所在行数  
           cols[n] = i;           //当前列不为最后一列时  
           if(n<MAXQUEEN-1)
           {  
             getArrangement(n+1);  
           }
           else{        //累计方案个数  
             num++;      //打印棋盘信息  
             printChessBoard();  
               }   
          }   
        }  
        public void printChessBoard(){    
           System.out.println("第"+num+"种走法 /n");  
           for(int i=0;i<MAXQUEEN;i++)
           {  
             for(int j=0;j<MAXQUEEN;j++)
             {  
               if(i==cols[j])
               {  
                 System.out.println("0 ");  
               }
               else
               {
               System.out.println("+ ");
               }  
             }  
             System.out.println("/n");  
           }     
        }  
        public static void main(String args[]){  
          Queen8 queen = new Queen8();  
        }     
    }  

八皇后问题有92种摆放方法。

 

posted on 2016-09-14 16:36  倪佳庆  阅读(521)  评论(0编辑  收藏  举报