大意:有三个杯子,开始时第一个杯子装满水(体积为a)。。。。倒来倒去,得到其中2个杯里的水的体积都为
a/2。。。。求最小次数。。。。不存在就输出NO。。。。
从图(以前都是图题)的点转化成状态(这题比较现实化)。。。。
struct point//a,b,c是某一状态下三个杯里装的水的体积。。。。v是从开始到该状态倒了多少次。。。。
{
int a, b, c, v;
};
在任意状态下(即每次的队头)。。。。都有6种倒法(即遍历6种)a->b,c。。。
b->a,c。。。。c->a,b。。。。。
#include"stdio.h" #include"string.h" #include"queue" using namespace std; bool v[111][111][111]; struct node { int a,b,c,cnt; }; void bfs(int a,int b,int c) { queue<node>Q; node q,p; q.a=a; q.b=0; q.c=0; q.cnt=0; Q.push(q); memset(v,0,sizeof(v)); while(!Q.empty()) { q=Q.front(); Q.pop(); v[q.a][q.b][q.c]=1; if( (q.a==a/2&&q.b==a/2) || (q.b==a/2&&q.c==a/2) || (q.a==a/2&&q.c==a/2)) { printf("%d\n",q.cnt); return ; } //a->其他 if(q.a!=0) { //a->b if(q.a>b-q.b)//倒完 { p.a=q.a-(b-q.b); p.b=b; p.c=q.c; p.cnt=q.cnt+1; } else //倒不完 { p.b=q.b+q.a; p.a=0; p.c=q.c; p.cnt=q.cnt+1; } if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } //a->c if(q.a>c-q.c)//倒完 { p.a=q.a-(c-q.c); p.c=c; p.b=q.b; p.cnt=q.cnt+1; } else//倒不完 { p.c=q.c+q.a; p.a=0; p.b=q.b; p.cnt=p.cnt+1; } if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } if(q.b!=0)//b到其他 { //b->a; if(q.b>a-q.a)//倒不完 { p.b=q.b-(a-q.a); p.a=a; p.c=q.c; p.cnt=q.cnt+1; } else//倒完 { p.a=q.a+q.b; p.b=0; p.c=q.c; p.cnt=q.cnt+1; } if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } //b->c; if(q.b>c-q.c)//倒不完 { p.b=q.b-(c-q.c); p.c=c; p.a=q.a; p.cnt=q.cnt+1; } else//倒完 { p.c=q.c+q.b; p.b=0; p.a=q.a; p.cnt=q.cnt+1; } if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } if(q.c!=0)//c到其他 { //c->a; if(q.c>a-q.a)//倒不完 { p.c=q.c-(a-q.a); p.a=a; p.b=q.b; p.cnt=q.cnt+1; if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } else//倒完 { p.a=q.a+q.c; p.c=0; p.b=q.b; p.cnt=q.cnt+1; if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } //c->b if(q.c>b-q.b)//倒不完 { p.c=q.c-(b-q.b); p.b=b; p.a=q.a; p.cnt=q.cnt+1; if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } else//倒完 { p.b=q.b+q.c; p.c=0; p.a=q.a; p.cnt=q.cnt+1; if(!v[p.a][p.b][p.c]) { v[p.a][p.b][p.c]=1; Q.push(p); } } } } puts("NO"); return ; } int main() { int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { if(a==0&&b==0&&c==0)break; if(a%2==1) printf("NO\n"); else bfs(a,b,c); } return 0; }