设计一种算法,打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行,不同列,也不再对角线上。这里的“对角线”指的是所有对角线,不只是评分整个期盼的那两条对角线。
分析:是个递归问题。
这里的特别之处在于,用一维数组来表示棋盘,下标表示行,元素代表列。
package cci;
import java.util.ArrayList;
public class CCI_9_9 {
//主程序
public static void calBoard(){
int size = 8;
int[] board = new int[size];
ArrayList<int[]> result = new ArrayList<int[]>();
calBoard(result, board, 0);
printBoard(result);
}
private static void calBoard(ArrayList<int[]> result, int[] board, int row){
//递归结束条件
if(row==board.length){//8
result.add(board.clone());
return;
}
for(int i=0; i<board.length; i++){
board[row] = i;//当前行尝试每一列,即列出所有子问题
if(checkValid(board, row)){
calBoard(result, board, row+1);
}
}
}
private static boolean checkValid(int[] board, int curRow){
for(int i=0; i<curRow; i++){
if(board[i]==board[curRow] || Math.abs(board[i]-board[curRow])==curRow-i)//在同一列或在对角线
return false;
}
return true;
}
private static void printBoard(ArrayList<int[]> result){
for(int[] item : result){
System.out.println("---------------------");
for(int row=0; row<item.length; row++){
//0表示没有皇后
for(int i=0; i<item[row]; i++){
System.out.print(0 + " ");
}
//1表示有皇后
System.out.print(1 + " ");
for(int i=item[row]+1; i<item.length; i++){
System.out.print(0 + " ");
}
System.out.println();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
calBoard();
}
}