給定乙個 n×n
'>n
×n 的棋盤,請你在上面放置 n
'>n
個棋子,要求滿足:
1 2 3 4 5 6
-------------------------
1 | | o | | | | |
-------------------------
2 | | | | o | | |
-------------------------
3 | | | | | | o |
-------------------------
4 | o | | | | | |
-------------------------
5 | | | o | | | |
-------------------------
6 | | | | | o | |
-------------------------
上圖給出了當 n=6
'>n=6
時的一種解決方案,該方案可用序列2 4 6 1 3 5
來描述,該序列按順序給出了從第一行到第六行,每一行擺放的棋子所在的列的位置。
請你編寫乙個程式,給定乙個 n×n
'>n×n
的棋盤以及 n
'>n
n個棋子,請你找出所有滿足上述條件的棋子放置方案。
輸入格式
共一行,乙個整數 n
'>n
。輸出格式
共四行,前三行每行輸出乙個整數序列,用來描述一種可行放置方案,序列中的第 i
'>i
i個數表示第 i
'>i
i行的棋子應該擺放的列的位置。
這三行描述的方案應該是整數序列字典序排在第
一、第二、第三的方案。
第四行輸出乙個整數,表示可行放置方案的總數。
資料範圍6≤
n≤13'>6≤n≤13
輸入樣例:
6
輸出樣例:皇后所在的行和列以及斜邊不能夠有別的皇后在,否則便會相互攻擊到。2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
這題就是八皇后,就是輸出的時候需要注意一下格式,只需要我們輸出前三種方案和方案總數,那麼只需要在輸出的**前加上約束條件,if(ans<=3)時,進行輸出
八皇后的難點就是如何對不符合要求的格仔進行染色:
因為我們使用深搜的每一層遞迴相當於是一行,在每一次遞迴當中選中其中的一列,所以可以定義乙個r陣列和乙個c陣列以及l陣列和r陣列,相當於皇后所在的行和列以及斜邊上進行染色
對於斜邊 : y = kx+b; 等價於 b=y-kx; 需要注意的是 k=1或k=-1;
所以 b=y-x 或者 b=y+x
因為y-x有可能小於0,所以我們需要加上乙個引數把它的值調回正數
所以陣列染色的表示為 r[x] , c[i] ,l[y+x] ,r[y-x+10];
重申:r[x]表示這一行是否有皇后 、 c[i]表示這一列是否有皇后
因為本題對無解的n和n==1時沒有特殊要求,所以只需要考慮一般情況,具體**如下:
1 #include2 #include3 #include4const
int n = 20;
5int
a[n];
6int
c[n],r[n],l[n],r[n];
7int
ans;
8intn;9
10 inline bool check(int x,int
y)15
16 inline void dfs(int
x)23 printf("\n"
);24}25
return;26
}2728for(int i = 1;i<=n;++i)39}
40}4142
43int
main()
44
1432 棋盤挑戰
給定乙個 n n 的棋盤,請你在上面放置 n 個棋子,要求滿足 上圖給出了當 n 6 時的一種解決方案,該方案可用序列 2 4 6 1 3 5 來描述,該序列按順序給出了從第一行到第六行,每一行擺放的棋子所在的列的位置。請你編寫乙個程式,給定乙個 n n 的棋盤以及 n 個棋子,請你找出所有滿足上述...
AcWing 1432 棋盤挑戰
給定乙個 n n的棋盤,請你在上面放置 n 個棋子,要求滿足 1 2 3 4 5 6 1 o 2 o 3 o 4 o 5 o 6 o 上圖給出了當 n 6n 6 時的一種解決方案,該方案可用序列2 4 6 1 3 5來描述,該序列按順序給出了從第一行到第六行,每一行擺放的棋子所在的列的位置。請你編寫...
Problem 棋盤挑戰
給定乙個 n n 的棋盤,請你在上面放置 n 個棋子,要求滿足 上圖給出了當 n 6 時的一種解決方案,該方案可用序列 2 4 6 1 3 5 來描述,該序列按順序給出了從第一行到第六行,每一行擺放的棋子所在的列的位置。請你編寫乙個程式,給定乙個 n n 的棋盤以及 n 個棋子,請你找出所有滿足上述...