您的位置:首页 > 大数据 > 人工智能

uva10651 - Pebble Solitaire(状态压缩)

2013-06-20 20:57 417 查看
状态压缩+记忆化搜索

状态压缩对位运算要求的较多。对位运算不熟的话就复习一下吧。

纯正的暴力然后用记忆化搜索剪枝。

碰到合适的情况就转移。【向右或向左】

求最后在棋盘上剩余最少的棋子数目。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 4500
int dp
;
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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: