poj 3185 The Water Bowls

// 题意:有20个只有0和1的数字,如果改变(取反)第i个数字,则相邻的两个数也会跟着改变。
// 求使得这20个数字全部变为0的最少步骤

#include <iostream> //BFS
using namespace std;

const int MAXN=1<<20;
int q[MAXN],dis[MAXN],vis[MAXN];
void bfs(int x)
{
q[0]=x;
dis[0]=0;
vis[x]=1;
int u,front,rear;
front=0;rear=1;
while(front<rear)
{
u=q[front];
if(u==0)
{
printf("%d\n",dis[front]);
break;
}
for(int i=0;i<20;++i)
{
int t=u;
t^=1<<i;
if(i>0)
t^=1<<(i-1);
if(i<19)
t^=1<<(i+1);
if(!vis[t])
{
vis[t]=1;
dis[rear]=dis[front]+1;
q[rear++]=t;
}
}
front++;
}
}
int main()
{
int x=0,b;
for(int i=0;i<20;++i)
{
scanf("%d",&b);
if(b)
x+=(1<<i);
}
bfs(x);
return 0;
}




#include <iostream> //DFS
using namespace std;

int cnt,res;
void dfs(int x,int i)
{
if(cnt>=res)
return;
if(i==20)
{
if(x==0)
res=min(res,cnt);
return;
}
dfs(x,i+1);

x^=1<<i;
if(i>0)
x^=1<<(i-1);
if(i<19)
x^=1<<(i+1);
cnt++;
dfs(x,i+1);
cnt--;
}
int main()
{
int x=0,b;
for(int i=0;i<20;++i)
{
scanf("%d",&b);
if(b)
x+=(1<<i);
}
res=21;
dfs(x,0);
printf("%d\n",res);
return 0;
}

posted on 2012-03-10 17:11  sysu_mjc  阅读(135)  评论(0编辑  收藏  举报

导航