uva10651 - Pebble Solitaire(状态压缩)
状态压缩+记忆化搜索
状态压缩对位运算要求的较多。对位运算不熟的话就复习一下吧。
纯正的暴力然后用记忆化搜索剪枝。
碰到合适的情况就转移。【向右或向左】
求最后在棋盘上剩余最少的棋子数目。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 4500
int dp[N];
char s[25];
int dfs(int total)
{
int &ans = dp[total], temp;
if(ans!=-1) return ans;
ans = 0;
for(int i = 0; i < 12; i++) if(total&1<<i)
ans+=1;
for(int i = 0; i < 10; i++)
{
temp = total;
if((total&1<<i)&&(total&1<<(i+1))&&!(total&1<<(i+2)))
{
temp&=~(1<<i);
temp&=~(1<<(i+1));
temp|=(1<<(i+2));
ans = min(ans,dfs(temp));
}
temp = total;
if(!(total&1<<i)&&(total&1<<(i+1))&&(total&1<<(i+2)))
{
temp&=~(1<<(i+2));
temp&=~(1<<(i+1));
temp|=(1<<i);
ans = min(ans,dfs(temp));
}
}
return ans;
}
int main ()
{
int total, cas;
scanf("%d",&cas);getchar();
while(cas--)
{
memset(dp,-1,sizeof(dp));
scanf("%s",s);getchar();
total = 0;
for(int i = 0; i < 12; i++)
{
if(s[i]=='o')
total^=(1<<i);
}
printf("%d\n",dfs(total));
}
return 0;
}
浙公网安备 33010602011771号