CCI 9.9 八皇后问题

设计一种算法,打印八皇后在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();
	}

}


你可能感兴趣的:(递归,八皇后)