SCOI2005 互不侵犯 解題報告

2021-08-28 06:35:13 字數 1600 閱讀 8736

題目描述

在n×n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。

輸入輸出格式

輸入格式:

只有一行,包含兩個數n,k ( 1 <=n <=9, 0 <= k <= n * n)

輸出格式:

所得的方案數

輸入輸出樣例:

input

3 2

output
n的個數是十分小的 (即使這樣爆搜也會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的題是乙個套路 具體實現也基本一樣 就是記錄的狀態...