您的位置:首页 > 其它

codevs1226倒水问题(Bfs)

2016-04-23 10:42 274 查看
/*
首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了)
最少步数 想到Bfs
维护队列里的状态:要有个步数  还要有v :此时刻三个杯子有多少水
然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了
然后每次取队首时判断有没有某一个杯子装的水恰好为答案
注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int x,y,z,f[101][101],c[4];
struct node
{
int v[4];//此状态每个杯子的水有多少
int step;//步数
};
queue<node>q;
int main()
{
cin>>x>>y>>z;
c[1]=x;c[2]=y;c[3]=201;//记号最大容量
node be;
be.step=0;
be.v[1]=0;be.v[2]=0;
be.v[3]=201;
q.push(be);//出状态 前两个杯子空 第三个大杯子满
while(!q.empty())
{
node tmp=q.front();
q.pop();
if(tmp.v[1]==z||tmp.v[2]==z)//判断符合条件了没有
{
cout<<tmp.step;
return 0;
}
int i,j;
for(i=1;i<=3;i++)// 枚举出水的杯子和接水的
for(j=1;j<=3;j++)
if(!tmp.v[i]||tmp.v[j]==c[j])continue;//如果出水的空了 或者接水的满了 跳过
else
{
int minn=min(tmp.v[i]+tmp.v[j],c[j])-tmp.v[j];//计算到多少水
node x=tmp;
x.v[i]-=minn;//倒水
x.v[j]+=minn;//节水
x.step=tmp.step+1;
if(f[x.v[1]][x.v[2]]==0)//判断此状态存在了没
{
f[x.v[1]][x.v[2]]=1;
q.push(x);
}
}
}
cout<<"impossible";
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: