N皇后的問題

N皇后問題是一個經典的問題,在一個N*N的棋盤上放置N個皇后,每行一個並使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊)

import org.junit.Test;

/**
 * @author Administrator
 *遞歸逐行放置n皇后,可以避開條件  “整個第i行的位置都不能放置”
 *利用一個數組record來保存已經放置的皇后位置,假設數組爲record record[i]的值表示第i行皇后的列數,在遞歸計算到第i行j列時查看record[0...k] k<i
 *的值若有說明(i,j)不能放置皇后,在看是否有|k-i|==record【k】-j  若有說明(i,j)不能放置
 */
public class Nqueue {
	public int num1(int n){
		if(n<1)
			return 0;
		int[] record=new int[n];
		return process(0,record,n);
					
	}
	public int process(int i,int[] record,int n){
		if(i==n)
			return 1;
		int res=0;
		for(int j=0;j<n;j++){
			if(isValid(record,i,j)){
				record[i]=j;
				res+=process(i+1,record,n);
			}
		}
		return res;
	}
	public boolean isValid(int[] record,int i,int j){
		for(int k=0;k<i;k++){
			if(j==record[k]||Math.abs(record[k]-j)==Math.abs(k-i))
				return false;
		}
		return true;
	}
	@Test
	public void test(){
		System.out.println(num1(2));
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章