時間限制: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;
}
}