地球人都知道,在西洋棋中,後如同太陽,光芒四射,威風八面,它能控制橫、堅、斜線位置。
看過清宮戲的中國人都知道,後宮乃步步驚心的險惡之地。各皇后都有自己的勢力範圍,但也總能找到相安無事的辦法。
所有中國人都知道,皇權神聖,伴君如伴虎,觸龍顏者死…
現在有乙個n*n的皇宮,國王佔據他所在位置及周圍的共9個格仔,這些格仔皇后不能使用(如果國王在王宮的邊上,占用的格仔可能不到9個)。當然,皇后也不會攻擊國王。
現在知道了國王的位置(x,y)(國王位於第x行第y列,x,y的起始行和列為1),請問,有多少種方案放置n個皇后,使她們不能互相攻擊。
輸入格式
一行,三個整數,皇宮的規模及表示國王的位置
輸出格式
乙個整數,表示放置n個皇后的方案數
樣例輸入
8 2 2樣例輸出 資料規模和約定
n<=12
其實很簡單,就是帶限制的n皇后問題,只要在初始化時在陣列中置為,在遞迴的時加候判斷條件就可以了
#include
#include
using
namespace std;
#define maxlen 14
#define empty 0
#define queen 4
#define kind 5
int a[maxlen]
[maxlen]
;int n, x, y;
int cnt =0;
intcan
(int posx,
int posy)
// 右下
int f1 =1;
i = posx;
j = posy;
while(1
<=i && i<=n &&
1<=j && j<=n)
}// 右上
int f2 =1;
i = posx;
j = posy;
while(1
<=i && i<=n &&
1<=j && j<=n)
}// 左下
int f3 =1;
i = posx;
j = posy;
while(1
<=i && i<=n &&
1<=j && j<=n)
}// 左上
int f4 =1;
i = posx;
j = posy;
while(1
<=i && i<=n &&
1<=j && j<=n)
}// 上
int f5 =1;
i = posx;
j = posy;
while(1
<=i && i<=n)
}// 下
int f6 =1;
i = posx;
j = posy;
while(1
<=i && i<=n)
}// 左
int f7 =1;
i = posx;
j = posy;
while(1
<=j && j<=n)
}// 右
int f8 =1;
i = posx;
j = posy;
while(1
<=j && j<=n)
}int f = f1 * f2 * f3 * f4 * f5 * f6 * f7 * f8;
if(f)
else
}void
dfs(
int row)
else}}
}int
main()
}}dfs(1)
; cout
}
藍橋杯 遞迴回溯 八皇后問題 N皇后問題
大致思路 其實就是三個功能函式 place attack output solution place函式中的任務就是把所有的 設為有maxqueen個 皇后的列位置安頓好。其傳入的引數僅乙個,為皇后的序數q,然後經過i從1 maxqueen的遍歷找到該序數q的皇后應在的列數號,使queen q i,...
藍橋杯 超級瑪麗(帶限制的走樓梯問題)遞迴解法
大家都知道 超級瑪麗 是乙個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數字置,分別是a1,a2,am,陷入其中則必死無疑。顯然,如果有兩個挨著的陷阱,則瑪麗是無論如何也跳過不去的。現在給出小道的長度n...
藍橋杯 特殊回文數(帶限制的全排列)遞迴解法
123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入一行,包含乙個正整數n。按從小到大的順序輸出滿足條件的整數,每個整數佔一行。1 n 54。include using namespace std in...