本文共 1679 字,大约阅读时间需要 5 分钟。
/** * @author phinecos * @since 2008/10/31 */ class EightQueen { static final int MAXSIZE = 8 ; // 棋盘大小 static int okTimes = 0 ; // 解法个数 static int [][] chess = new int [MAXSIZE][MAXSIZE]; // 棋盘 public static boolean CanPut( int row, int col) { // 皇后能否放置在chess[row][col]的位置上 // 第row行不能有多于1个皇后 int i,j; for (i = 0 ;i < MAXSIZE; ++ i) { if (chess[row][i] == 1 ) return false ; } // 第col列不能有多于1个皇后 for (i = 0 ;i < MAXSIZE; ++ i) { if (chess[i][col] == 1 ) return false ; } // 对角线不能有多于1个皇后 // 反对角线 for (i = row - 1 ,j = col + 1 ;i >= 0 && j < MAXSIZE; -- i, ++ j) { if (chess[i][j] == 1 ) return false ; } for (i = row + 1 ,j = col - 1 ;i < MAXSIZE && j >= 0 ; ++ i, -- j) { if (chess[i][j] == 1 ) return false ; } // 对角线 for (i = row - 1 ,j = col - 1 ;i >= 0 && j >= 0 ; -- i, -- j) { if (chess[i][j] == 1 ) return false ; } for (i = row + 1 ,j = col + 1 ;i < MAXSIZE && j < MAXSIZE; ++ i, ++ j) { if (chess[i][j] == 1 ) return false ; } return true ; } public static void Solve( int curChess, int num) { if (num == 8 ) { // 八个皇后了, okTimes ++ ; return ; } else { if (curChess < 64 ) { int i,j; i = curChess / MAXSIZE; // 行 j = curChess % MAXSIZE; // 列 if (chess[i][j] == 0 && CanPut(i,j) == true ) { // chesss[i][j]空着,并且经测试可以放置 chess[i][j] = 1 ; // 放置皇后下去 Solve(curChess + 1 ,num + 1 ); chess[i][j] = 0 ; // 回溯 } Solve(curChess + 1 ,num); // chess[i][j]无法放置,跳过它 } } } public static void main(String args[]) { int i,j; for (i = 0 ;i < MAXSIZE; ++ i) for (j = 0 ;j < MAXSIZE; ++ j) { chess[i][j] = 0 ; } Solve( 0 , 0 ); System.out.println( " 八皇后问题共有 " + okTimes + " 个解法 " ); } } 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/31/1323800.html,如需转载请自行联系原作者