八皇后

八皇后问题是个很经典的递归、迭代问题。解决思路就是只要保证所有皇后不在同一列和同斜线上。

假设就j,k为两个皇后所在的行 x[j]、x[k]表示两个皇后的位置。当两个皇后在同一列或同斜线上 可以用数学式子来表达|j-k|=|x[j]-x[k]|、x[j]=x[k]。所有当这两个条件不满足的时候问题就能解决。

解决方法如下:

  1. public class Queen8 {  
  2. public static int num = 0; //累计方案总数  
  3. public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数  
  4. public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况  
  5. public Queen8() {  
  6. //核心函数  
  7.       getArrangement(0);  
  8.       System.out.print("/n");  
  9.       System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。");  
  10.     }  
  11. public void  getArrangement(int n){  
  12. //遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true  
  13. boolean[] rows = new boolean[MAXQUEEN];  
  14. for(int i=0;i<n;i++){  
  15.         rows[cols[i]]=true;  
  16. int d = n-i;  
  17. if(cols[i]-d >= 0)rows[cols[i]-d]=true;  
  18. if(cols[i]+d <= MAXQUEEN-1)rows[cols[i]+d]=true;   
  19.      }  
  20. for(int i=0;i<MAXQUEEN;i++){  
  21. //判断该行是否合法    
  22. if(rows[i])continue;  
  23. //设置当前列合法棋子所在行数  
  24.        cols[n] = i;  
  25. //当前列不为最后一列时  
  26. if(n<MAXQUEEN-1){  
  27.          getArrangement(n+1);  
  28.        }else{  
  29. //累计方案个数  
  30.          num++;  
  31. //打印棋盘信息  
  32.          printChessBoard();  
  33.        }   
  34.      }  
  35.     }  
  36. public void printChessBoard(){  
  37.        System.out.print("第"+num+"种走法 /n");  
  38. for(int i=0;i<MAXQUEEN;i++){  
  39. for(int j=0;j<MAXQUEEN;j++){  
  40. if(i==cols[j]){  
  41.              System.out.print("0 ");  
  42.            }else  
  43.              System.out.print("+ ");  
  44.          }  
  45.          System.out.print("/n");  
  46.        }  
  47.     }  
  48. public static void main(String args[]){  
  49.       Queen8 queen = new Queen8();  
  50.     }  
  51. }  
posted @ 2016-09-16 23:08  LLSS皮  阅读(117)  评论(0编辑  收藏  举报