初级bfs
注意对题意的理解。。。
按题目要求的情况,可乐应该被平分在两个杯里。形如s=m+n=half其实是不满足题意的
代码没用queue
hash用的是m*100+n
比较简陋啊。。。
#include<iostream>
#include<set>
using namespace std;
struct water
{
int s;
int m;
int n;
};
water state[400];
int dist[400];
int bfs(int s,int m,int n);
int main()
{
int s,m,n;
for(;cin>>s>>m>>n&&s!=0;)
{
int ans;
if (s%2) {cout<<"NO\n";continue;}
if (n==m) {cout<<"1\n";continue;}
if (n>m) swap(n,m);// s>m>n
state[1].s=s;
state[1].m=0;
state[1].n=0;
ans=bfs(s,m,n);
if(ans)
cout<<dist[ans]<<"\n";
else cout<<"NO\n";
}
return 0;
}
int bfs(int s,int m,int n)
{
set<int> ws;
set<int>::iterator p;
int half=s/2;
ws.insert(0);
int front=1,rear=2;
//front=0 means no key
while(front<rear)
{
water &c=state[front];
if(c.s==c.m&&c.s==half) {return front;}
int i,news,newm,newn,sum;
for(i=0;i<6;i++)
{
if(i==0)
{newn=c.n;if((c.s+c.m)>m) news=c.s+c.m-m,newm=m; else newm=c.s+c.m,news=0;}
if(i==1)
{newm=c.m;if((c.s+c.n)>n) news=c.s+c.n-n,newn=n; else newn=c.s+c.n,news=0;}
if(i==2)
{newn=c.n;if((c.m+c.s)>s) newm=c.m+c.s-s,news=s; else news=c.m+c.s,newm=0;}
if(i==3)
{news=c.s;if((c.m+c.n)>n) newm=c.m+c.n-n,newn=n; else newn=c.m+c.n,newm=0;}
if(i==4)
{newm=c.m;if((c.n+c.s)>s) newn=c.n+c.s-s,news=s; else news=c.n+c.s,newn=0;}
if(i==5)
{news=c.s;if((c.n+c.m)>m) newn=c.n+c.m-m,newm=m; else newm=c.n+c.m,newn=0;}
sum=newm*100+newn;
p=ws.find(sum);
if(newm<=m&&newn<=n&&news<=s&&p==ws.end())
{
water &t=state[rear];
t.s=news,t.m=newm,t.n=newn;
dist[rear]=dist[front]+1;
rear++;
ws.insert(sum);
}
}
front++;
}
return 0;
}