算法----八皇后擴展

算法訓練 王、後傳說  
時間限制:1.0s   內存限制:256.0MB
提交此題    
問題描述
  地球人都知道,在國際象棋中,後如同太陽,光芒四射,威風八面,它能控制橫、堅、斜線位置。
  看過清宮戲的中國人都知道,後宮乃步步驚心的險惡之地。各皇后都有自己的勢力範圍,但也總能找到相安無事的辦法。
  所有中國人都知道,皇權神聖,伴君如伴虎,觸龍顏者死......
  現在有一個n*n的皇宮,國王佔據他所在位置及周圍的共9個格子,這些格子皇后不能使用(如果國王在王宮的邊上,佔用的格子可能不到9個)。當然,皇后也不會攻擊國王。
  現在知道了國王的位置(x,y)(國王位於第x行第y列,x,y的起始行和列爲1),請問,有多少種方案放置n個皇后,使她們不能互相攻擊。
輸入格式
  一行,三個整數,皇宮的規模及表示國王的位置
輸出格式
  一個整數,表示放置n個皇后的方案數
樣例輸入
8 2 2
樣例輸出
10
數據規模和約定

  n<=12

import java.util.Scanner;
public class Main{
	
	private static int count = 0;
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int x = sc.nextInt();
		int y = sc.nextInt();
		
		int[] pos = new int[n+1];//拋棄0位置號的元素
		
		nQueens(pos,n,x,y);
		System.out.println(count);
	}

	private static void nQueens(int[] pos, int n,int x,int y) {
		
		int j=1;
		
		while(j>=1){
			pos[j]+=1;
			while(pos[j]<=n && judge(pos,j) == 0){//不滿足條件則嘗試往後走
				pos[j] += 1;
			}
			
			if(j==n && pos[j]<=n){//輸出滿足條件的結果
//				for(int k = 1;k<=n;k++)
//					System.out.print(pos[k]);
//				System.out.println();
				judgeKing(pos,n,x,y);
			}
			if(pos[j]<=n && j<n){//滿足條件的則繼續往後走,不滿足則回溯
				j++;
			}else{//退到無路可退則到頭了
				pos[j]=0;
				j--;
			}
		}
	}

	private static void judgeKing(int[] pos,int n, int x, int y) {
		int[][] a = new int[n+2][n+2];//此處第0號和第n+1號格子不用初始化爲0
		int i,j;
		a[x][y] = a[x-1][y] = a[x+1][y] = 1;//此處藉助ppt羅列出來便於解
		a[x][y-1] = a[x-1][y-1] = a[x+1][y-1] = 1;
		a[x][y+1] = a[x-1][y+1] = a[x+1][y+1] = 1;
		for(i=1;i<=n;i++){
			if(a[i][pos[i]] == 1)
				return;//此處break 和 return 的效果是一樣的
		}
		if(i==n+1)count++;
	}

	private static int judge(int[] pos, int j) {//判斷是否滿足條件
		
		for(int i = 1;i<j;i++){
			if(pos[j] == pos[i] || Math.abs(pos[j] - pos[i])==Math.abs(i-j))
				return 0;
		}
		return 1;
	}
}


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