題目描述
在n×n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。
輸入輸出格式
輸入格式:
只有一行,包含兩個數n,k ( 1 <=n <=9, 0 <= k <= n * n)
輸出格式:
所得的方案數
輸入輸出樣例:
input
3 2outputn的個數是十分小的 (即使這樣爆搜也會t飛!!)
所以用一波狀壓dp!
設f[i][j][k]代表前i行放了k個,排列方式是j,(j的二進位制形式就是排列方式)。
可以 (必須) 先預處理出一行的可行排列情況:
void
dfs(
int w,
int sum,
int num)
//分別為排列情況,放的點的個數,到底幾個點了
dfs(w,sum,num+1)
;//不防這個點
dfs(w+(1
<,sum+
1,num+2)
;//放這個點,那麼下乙個點不能放
}
那麼根據題意,這個方案與另乙個方案是否衝突 就顯而易見啦
sit[j]&sit[k]==1 上下相鄰
(sit[j]<<1)&sit[k]==1 斜著相鄰
sit[j]&(sit[k]<<1) ==1 同上
dp+判斷 code:
for
(int i=
2;i<=n;i++
)for
(int j=
1;j<=cnt;j++
)for
(int k=
1;k<=cnt;k++
)
完整**:
#include
using
namespace std;
#define maxn 2005
int cnt,n,k;
int sit[maxn]
,gs[maxn]
;long
long f[10]
[maxn]
[105];
long
long ans;
void
dfs(
int w,
int sum,
int num)
dfs(w,sum,num+1)
;dfs
(w+(
1<,sum+
1,num+2)
;}intmain()
ans=0;
for(
int i=
1;i<=cnt;i++
) ans+
=f[n]
[i][k]
;printf
("%lld"
,ans)
;return0;
}
注意開long long。。。 SCOI2005 互不侵犯
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。只有一行,包含兩個數n,k 1 n 9,0 k n n 方案數3 2 同sgu223 include include include include ...
SCOI2005 互不侵犯
題目描述 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。輸入格式 只有一行,包含兩個數n,k 1 n 9,0 k n n 輸出格式 所得的方案數 ly最可愛啦 這題。想了5分鐘,寫了10分鐘,調了...
SCOI2005 互不侵犯
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。兩個數n,k 1 n 9,0 k n n 方案數。3 2果然啊 狀壓題都是乙個套路 和前面那個noi的題是乙個套路 具體實現也基本一樣 就是記錄的狀態...