1. 程式人生 > >藍橋杯訓練:八皇后問題

藍橋杯訓練:八皇后問題

八皇后問題:在8×8格的國際象棋上擺放八個皇后,
使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,
問有多少種擺法。

思路,八皇后是典型的回溯演算法,方法如下,dfs演算法搜全排列,已行為推進,每選新一行跳轉布林判斷。新行的選取不能和前面已經放好的元素同列或者對角線,c==j || r-i=Math.abs(c-j) //絕對值的部分是斜率 k=(x1-x2)/(y1-y2) =±1 這種情況既在同一對角線上。
不滿足false置空,maze[][]=false回溯。繼續探尋。若滿足,直接在遞迴退出條件step=8里加上count++,統計滿足次數。

package 藍橋杯;

public class eightqueen {

	static private final int col_row_num=8;
	static private int count=0;
	static private boolean maze[][]=new boolean[col_row_num][col_row_num];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		dfs(0);
		System.out.println(count);
	}
	static boolean whetherConflict(int r,int c) {
		for(int i=0;i<r;i++) {
			for(int j=0;j<col_row_num;j++) {
				if(maze[i][j]) {
					if(c==j||r-i==Math.abs(c-j)) {
						return false;
					}
				}
			}
		}
		return true;
		
	}
    static void dfs(int step) {
    	if(step==col_row_num) {
    		count++;
    		return;
    	}
    	for(int c=0;c<col_row_num;c++) {
    		if(!maze[step][c]) {
    			if(whetherConflict(step,c)) {
    				maze[step][c]=true;
    				dfs(step+1);
    				maze[step][c]=false;
    			}
    		}
    	}
    }
}

參考於https://blog.csdn.net/liujian20150808/article/details/54691529