填水罐的,两个罐子,左道右道,最后使右边罐子水量为某值
以后路径也用string存储。。太方便了。。
BFS,方向,队列,判重
还有,注意细节啊!!!!!!
#include<iostream>
#include<queue>
#include<string>
#include<memory.h>
using namespace std;
int A,B,N;
struct node
{
int a,b;
string ways;
};
string W[7]={"fill A", "fill B","empty A" ,"empty B", "pour A B","pour B A" ,"success"};
queue<node> Q;
int vis[1000][1000];
void output(node &at)
{
size_t n=at.ways.size();
for(int i=0;i<n;i++)
cout<<W[size_t(at.ways[i]- '0')]<<endl;
cout<<W[6]<<endl;
//cout<<at.ways<<endl;
//cout<<at.b<<endl;
}
int main()
{
while(cin>>A>>B>>N)
{
memset(vis,0, sizeof(vis));
while(!Q.empty())
Q.pop();
struct node beg={0,0,"" };
Q.push(beg);
vis[0][0]=1;
struct node at,next;
while(!Q.empty())
{
at=next=Q.front();
Q.pop();
//if(vis[at.a][at.b]) continue;
if(at.b==N)
{
output(at);
break;
}
if(at.a<A)
{
next.a=A;
next.b=at.b;
next.ways=at.ways+ "0";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
if(at.b<B)
{
next.b=B;
next.a=at.a;
next.ways=at.ways+ "1";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
if(at.a!=0)
{
next.a=0;
next.b=at.b;
next.ways=at.ways+ "2";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
if(at.b!=0)
{
next.b=0;
next.a=at.a;
next.ways=at.ways+ "3";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
if(at.a!=0&&at.b!=B)
{
int gap1=B-at.b;
next.b=(at.a+at.b)>B? B:(at.a+at.b);
next.a=at.a>gap1?at.a-gap1:0;
next.ways=at.ways+ "4";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
if(at.b!=0&&at.a!=A)
{
int gap2=A-at.a;
next.a=(at.a+at.b)>A? A:(at.a+at.b);
next.b=at.b>gap2? at.b-gap2:0;
next.ways=at.ways+ "5";
if(vis[next.a][next.b]==0)
{
Q.push(next);
vis[next.a][next.b]=1;
}
}
}
}
return 0;
}
zoj1005 jugs 广搜,错了好多次。。细节啊!!
最新推荐文章于 2018-09-06 07:45:54 发布