首页 > 代码库 > 八皇后

八皇后

  1. class Queen  
  2.   
  3. {  
  4.   
  5.     static final int QUEEN_MAX = 8; // 皇后的数量  
  6.   
  7.     int[][] Queencount = new int[QUEEN_MAX][QUEEN_MAX];// 分配8X8的数组,充当棋盘,存放皇后  
  8.   
  9.     int resultCount = 0;// 记录皇后的放置方法的总数  
  10.   
  11.     int[] Queenplace = new int[QUEEN_MAX];// 存放每行的皇后位置即第column行的皇后放置位置是Queenplace[column]  
  12.   
  13.     public void putQueen(int Rows)  
  14.   
  15.     {  
  16.   
  17.         int row = Rows;// 行标  
  18.   
  19.         for (int column = 0; column < QUEEN_MAX; column++)// column表示列标  
  20.   
  21.         {  
  22.   
  23.             if (Queencount[row][column] == 0)// row行、column列可以放皇后  
  24.   
  25.             {  
  26.   
  27.                 for (int rowi = row + 1; rowi < QUEEN_MAX; rowi++)// for循环的作用是使其斜下方和正下方不为0  
  28.   
  29.                 {  
  30.   
  31.                     Queencount[rowi][column]++;  
  32.   
  33.                     if (column - rowi + row >= 0)  
  34.   
  35.                     {  
  36.   
  37.                         Queencount[rowi][column - rowi + row]++;  
  38.   
  39.                     }  
  40.   
  41.                     if (column + rowi - row < QUEEN_MAX)  
  42.   
  43.                     {  
  44.   
  45.                         Queencount[rowi][column + rowi - row]++;  
  46.   
  47.                     }  
  48.   
  49.                 } //  
  50.   
  51.                 Queenplace[row] = column;// row行column列放了皇后  
  52.   
  53.                 if (row == QUEEN_MAX - 1)// 皇后已放满,打印出皇后布局  
  54.   
  55.                 {  
  56.   
  57.                     printQueen(++resultCount);  
  58.   
  59.                 }  
  60.   
  61.                 else // 否则继续排列下一行皇后  
  62.   
  63.                 {  
  64.   
  65.                     putQueen(row + 1);  
  66.   
  67.                 }  
  68.   
  69.                 for (int rows = row + 1; rows < QUEEN_MAX; rows++)// 回溯,在此行的皇后不放此列column  
  70.                                                                     // ,恢复该位置的正下面/斜下面的count  
  71.   
  72.                 {  
  73.   
  74.                     Queencount[rows][column]--;  
  75.   
  76.                     if (column - rows + row >= 0)  
  77.   
  78.                     {  
  79.   
  80.                         Queencount[rows][column - rows + row]--;  
  81.   
  82.                     }  
  83.   
  84.                     if (column + rows - row < QUEEN_MAX)  
  85.   
  86.                     {  
  87.   
  88.                         Queencount[rows][column + rows - row]--;  
  89.   
  90.                     }  
  91.   
  92.                 }  
  93.   
  94.             }  
  95.   
  96.         }  
  97.   
  98.         if (row == 0)  
  99.   
  100.         {  
  101.   
  102.             System.out.println(QUEEN_MAX + "皇后问题共有" + resultCount + "个解.");  
  103.   
  104.         }  
  105.   
  106.     }  
  107.   
  108.     public void printQueen(int size)// 打印皇后布局  
  109.   
  110.     {  
  111.   
  112.         System.out.println(QUEEN_MAX + "皇后的第" + size + "个解是:");  
  113.   
  114.         System.out.println();  
  115.   
  116.         for (int row = 0; row < QUEEN_MAX; row++)  
  117.   
  118.         {  
  119.   
  120.             for (int column = 0; column < QUEEN_MAX; column++)  
  121.   
  122.             {  
  123.   
  124.                 System.out.print(Queenplace[row] == column ? " * " : " - ");  
  125.   
  126.             }  
  127.   
  128.             System.out.println();  
  129.   
  130.         }  
  131.   
  132.         System.out.println();  
  133.   
  134.     }  
  135.   
  136.     public static void main(String[] args)  
  137.   
  138.     {  
  139.   
  140.         Queen Q = new Queen();  
  141.   
  142.         Q.putQueen(0);  
  143.   
  144.     }  
  145.   
  146. }  

八皇后