百練2754 八皇后

2021-08-07 15:32:36 字數 1517 閱讀 6690

總時間限制: 

1000ms 

記憶體限制: 

65536kb

描述

會下西洋棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。 

對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a=b

1b2...b

8,其中b

i為相應擺法中第i行皇后所處的列數。已經知道8皇后問題一共有92組解(即92個不同的皇后串)。

給出乙個數b,要求輸出第b個串。串的比較是這樣的:皇后串x置於皇后串y之前,當且僅當將x視為整數時比y小。

輸入第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括乙個正整數b(1 <= b <= 92)

輸出輸出有n行,每行輸出對應乙個輸入。輸出應是乙個正整數,是對應於b的皇后串。

樣例輸入

2

192

樣例輸出

15863724

不好意思,昨天食言了,沒有更新部落格,因為有點懶惰。今天9月1號了,後天即將返回大連,推免的整個征程只剩下最後不到乙個月的時間,因此,行百里者半九十,一定要抓住最後的時間,拼上一把。

八皇后問題,用遞迴來做,思路我是有的,就是依次嘗試各個棋子,使之不與已經擺好的棋子衝突,只不過是否衝突的判斷條件我想錯了,即a與b不衝突,b與c不衝突,不代表a與c不衝突,我只考慮了相鄰兩個棋子的情況,而實際上應該從頭開始遍歷,這裡有點像dp中的最長公共子串行的問題,不能僅考慮相鄰的情況。

#include int hang[8],ans[92][8],num;

void queen(int n);

int main()

printf("\n");

}}void queen(int n)

num++;

return;

}for(i=0;i<8;i++){//核心

for(j=0;j

*****************************************

今天9.7,剛剛重新寫了一遍八皇后的演算法,終於感覺搞懂了一點遞迴。。真的是除錯出成果啊,不親自除錯一下什麼也發現不了。重寫的這一遍,剛開始遞迴的核心部分也就是queen中的迴圈弄錯了,必須時刻把握i,j的含義。然後我就一直奇怪一點,n==8之後hang對ans賦完值了,為什麼不用把hang的資料清空呢?馬上不是要進行下一種情況了嗎?本次的資料不會對下一次產生影響嗎?顯然這時我還沒有理解遞迴的本質。遞迴實際上就是用來代替迴圈的,並且是基於回溯法的,這點我通過除錯程式發現的。對於0~7的每乙個數(每一行),都會執行queen的核心程式,以期望找到在之前的行填好的條件下,還能有多少可能的結果,回溯是不斷試錯的過程,這樣不行,往回退一步可能就行了(這裡所謂「行」就是指在現有條件下能夠填滿8行,不再回溯而是直接走到return),而這時以前幾行的資料是不需要刪除的!當所有解都被找到後,queen自然就會結束,不用擔心出不去的問題。

堅持,而不是打雞血~

百練 2754 八皇后

總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b 2...

百練 2754 八皇后 (DFS)

2754 八皇后 總時間限制 1000ms 記憶體限制 65536kb 描述會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即...

OpenJudge 百練2754 八皇后

description 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2.b8,其中bi為相應擺法中第i行皇后所...