poj 1321
http://poj.org/problem?id=1321
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
思路:状态dp(可dfs暴力过)
View Code
#include<stdio.h>
#include<string.h>
int dp[2][1<<9];
int s[1<<9],a[10];
char str[10][10];
int main()
{
int n=8,k;
for(int i = 1; i <= (1 << n); ++ i) s[i] = s[i >> 1] + i % 2;
while(scanf("%d%d",&n,&k)==2)
{
if(n==-1&&k==-1)break;
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i = 1; i <= n; ++ i){
scanf("%s",str[i]);
for(int j = 0; j < n; ++ j)
if(str[i][j] == '.') a[i] += (1<<j);
}
dp[0][0] = 1;
int flag = 1;
int ans = 0;
for(int i = 1; i <= n; ++ i){
for(int j = 0; j < (1 << n); ++ j){
if(s[j] > i) continue;
for(int t = j; t > 0; t -= t & -t)
if(((t&-t)&a[i])==0)
dp[flag][j] += dp[flag^1][j & ~(t&-t)];
if(s[j] != i) dp[flag][j] += dp[flag^1][j];
if((s[j] == k)&&(i == n)) ans += dp[flag][j];
}
flag ^= 1;
}
printf("%d\n",ans);
}return 0;
}

浙公网安备 33010602011771号