在n x n 的棋盤裡面放 個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共 個格仔。
(1 <= n <= 9, 0 <= k <= n x n)
只有一行,包含兩個數 n, k。
所得的方案數。
3 2
16
大家都做過玉公尺地吧,這其實和那道題很像,只是玉公尺地是上下左右衝突,這個多了個角上也衝突,那就再加兩個if判斷角上衝突的情況
具體流程詳見注釋
#include#include#include#define int long long
using namespace std;
int dp[10][1<<10][100];//dp[i][j][k]表示第i行擺放的國王狀態為j,總共擺放k個國王的方案數
int state[1<<10], num[1<<10];//預處理每行所有合法的狀態和他們包含1的個數
int n, cnt, tot, ans;//tot為每行合法狀態總數
int lowbit(int x)
int getnum(int x)
signed main()}}
}for(int i=1; i<=tot; i++) ans += dp[n][i][cnt]; //列舉最後一行的方案,求和方案數
printf("%lld\n", ans);
return 0;
}
互不侵犯king 狀壓dp
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。1 le n le 9,0 le k le n n 這道題如果普通dfs肯定會超時。為什麼呢?我們發現一行中的狀態是固定的,同時行與行之間的衝突情況也...
狀壓dp SCOI 2005 互不侵犯
題意 在n n n nn n的棋盤裡面放k kk個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8 88個格仔。考慮如何狀壓,對於每一行,我們用乙個長度為n nn的二進位制串表示每一行的狀態,比如1010 1010 1010 表示...
M 互不侵犯King(壓狀dp)
在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上 左下右上右下八個方向上附近的各乙個格仔,共8個格仔。input 只有一行,包含兩個數n,k 1 n 9,0 k n n output 方案數。sample input 3 2sample output...