Cola HDU1495

来源:互联网 发布:js定时执行 编辑:程序博客网 时间:2024/05/20 13:06
Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input
7 4 3
4 1 3
0 0 0
Sample Output
NO

3

//广搜#include <stdio.h>#include <string.h>struct node{int s;int n;int m;int step;};struct node queue[200];int book[101][101];//标记n,m两个杯子当前状态int head,tail;int s,m,n;void bfs(){struct node temp;head=tail=0;queue[tail].s=s;queue[tail].n=0;queue[tail].m=0;queue[tail].step=0;tail++;book[0][0]=1;while(head<tail){temp=queue[head];if((temp.n==s/2&&temp.m==s/2)||(temp.n==s/2&&temp.s==s/2)||(temp.m==s/2&&temp.s==s/2)){printf("%d\n",temp.step);return;}//s->ntemp=queue[head];if(temp.s&&temp.n<n){if(temp.s>n-temp.n){temp.s=temp.s-(n-temp.n);temp.n=n;}else{temp.n=temp.n+temp.s;temp.s=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}//s->mtemp=queue[head];if(temp.s&&temp.m<m){if(temp.s>m-temp.m){temp.s=temp.s-(m-temp.m);temp.m=m;}else{temp.m=temp.m+temp.s;temp.s=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}//n->stemp=queue[head];if(temp.n&&temp.s<s){if(temp.n>s-temp.s){temp.n=temp.n-(s-temp.s);temp.s=s;}else{temp.s=temp.s+temp.n;temp.n=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}//n->mtemp=queue[head];if(temp.n&&temp.m<m){if(temp.n>m-temp.m){temp.n=temp.n-(m-temp.m);temp.m=m;}else{temp.m=temp.m+temp.n;temp.n=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}//m->stemp=queue[head];if(temp.m&&temp.s<s){if(temp.m>s-temp.s){temp.m=temp.m-(s-temp.s);temp.s=s;}else{temp.s=temp.s+temp.m;temp.m=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}//m->ntemp=queue[head];if(temp.m&&temp.n<n){if(temp.m>n-temp.n){temp.m=temp.m-(n-temp.n);temp.n=n;}else{temp.n=temp.n+temp.m;temp.m=0;}    if(!book[temp.n][temp.m]){    book[temp.n][temp.m]=1;    queue[tail]=temp;    queue[tail].step++;    tail++;    }}head++;}    printf("NO\n");    return;}int main(){while(scanf("%d%d%d",&s,&n,&m)!=EOF&&s&&n&&m){memset(book,0,sizeof(book));if(s%2==1)printf("NO\n");else    bfs();}return 0;}


1 0