[USACO1.5]八皇后 Checker Challenge
給定一個(gè) N×N 的棋盤,請(qǐng)你在上面放置 N 個(gè)棋子,要求滿足:
每行每列都恰好有一個(gè)棋子
每條對(duì)角線上都最多只能有一個(gè)棋子
上圖給出了當(dāng) N=6 時(shí)的一種解決方案,該方案可用序列 2 4 6 1 3 5 來(lái)描述,該序列按順序給出了從第一行到第六行,每一行擺放的棋子所在的列的位置。
請(qǐng)你編寫(xiě)一個(gè)程序,給定一個(gè) N×N 的棋盤以及 N 個(gè)棋子,請(qǐng)你找出所有滿足上述條件的棋子放置方案。
輸入格式
共一行,一個(gè)整數(shù) N。
輸出格式
共四行,前三行每行輸出一個(gè)整數(shù)序列,用來(lái)描述一種可行放置方案,序列中的第 i 個(gè)數(shù)表示第 i 行的棋子應(yīng)該擺放的列的位置。
這三行描述的方案應(yīng)該是整數(shù)序列字典序排在第一、第二、第三的方案。
第四行輸出一個(gè)整數(shù),表示可行放置方案的總數(shù)。
數(shù)據(jù)范圍
6≤N≤13
輸入樣例:
6
輸出樣例:
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
這條對(duì)角線x-y+n,y-x+n都可以,但是數(shù)組的大小要發(fā)現(xiàn)變化,在這道題,如果你用x-y+n,N = 30,但如果你要y-x+n,N可以 = 20,所以數(shù)組開(kāi)大一點(diǎn)。
代碼如下:
#include <iostream> using namespace std; const int N = 30; int path[N]; bool col[N],duijiao1[N],duijiao2[N]; int ans; int n; void dfs(int x)//行 {if (x > n){ans++;if (ans<=3){for (int i = 1;i<=n;i++){cout<<path[i]<<" ";}cout<<endl;return ;}}for (int y = 1;y<=n;y++){if (!col[y] && !duijiao1[x+y] && !duijiao2[x-y+n]){col[y] = duijiao1[x+y] = duijiao2[x-y+n] = true;path[x] = y;dfs(x+1);col[y] = duijiao1[x+y] = duijiao2[x-y+n] = false;// path[x] = 0;}} }int main() {cin>>n;dfs(1);cout<<ans<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的[USACO1.5]八皇后 Checker Challenge的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么用微信第三方平台源码建站(微信第三方
- 下一篇: [蓝桥杯]字母组串-递归