zoj1005 jugs 广搜,错了好多次。。细节啊!!

填水罐的,两个罐子,左道右道,最后使右边罐子水量为某值
以后路径也用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值