大家一定覺的運動以後喝可樂是一件很愜意的事情,但是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
與前面的pots一樣的題型POJ --3143。
思路:共6種操作,1倒水給2,1-3,2-3,2-1,3-1,3-2;分別爲倒滿與倒不滿兩種情況,入隊;
用一個三維數組book記錄三個水杯的情況;判斷入隊;
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int s,m,n;
bool book[101][101][101];
struct node
{
int s;
int m;
int n;
int step;
};
void bfs()
{
int flag=0;
queue<node>q;
node now,temp;
now.s=s,now.m=0,now.n=0,now.step=0;
book[now.s][now.m][now.n]=true;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if((now.m==now.s&&now.n==0)||(now.s==now.n&&now.m==0)||(now.m==now.n&&now.s==0))
{
flag=1;
printf("%d\n",now.step);break;
}
for(int i=0; i<6; i++)
{
temp.step=now.step+1;
if(i==0)
{
if(now.s>=(m-now.m)) //倒得滿
{
temp.s=now.s-(m-now.m);
temp.m=m;
temp.n=now.n;
}
else //倒不滿
{
temp.m=now.s+now.m;
temp.s=0;
temp.n=now.n;
}
}
if(i==1)
{
if(now.s>=(n-now.n))
{
temp.s=now.s-(n-now.n);
temp.m=now.m;
temp.n=n;
}
else
{
temp.n=now.s+now.n;
temp.s=0;
temp.m=now.m;
}
}
if(i==2)
{
if(now.m>=n-now.n)
{
temp.s=now.s;
temp.m=now.m-(n-now.n);
temp.n=n;
}
else
{
temp.s=now.s;
temp.n=now.n+now.m;
temp.m=0;
}
}
if(i==3)
{
if(now.m>=(s-now.s))
{
temp.m=now.m-(s-now.s);
temp.s=s;
temp.n=now.n;
}
else
{
temp.s=now.s+now.m;
temp.m=0;
temp.n=now.n;
}
}
if(i==4)
{
if(now.n>=(s-now.s))
{
temp.n=now.n-(s-now.s);
temp.s=s;
temp.m=now.m;
}
else
{
temp.s=now.s+now.n;
temp.n=0;
temp.m=now.m;
}
}
if(i==5)
{
if(now.n>=(m-now.m))
{
temp.n=now.n-(m-now.m);
temp.m=m;
temp.s=now.s;
}
else
{
temp.m=now.m+now.n;
temp.n=0;
temp.s=now.s;
}
}
if(book[temp.s][temp.m][temp.n]==false)
{
book[temp.s][temp.m][temp.n]=true;
q.push(temp);
}
}
}
if(!flag)printf("NO\n");
}
int main()
{
while(cin>>s>>m>>n&&s&&m&&n)
{
memset(book,false,sizeof(book));
if(m==n)
{
printf("1\n");
continue;
}
if(s%2==0)
bfs();
else
printf("NO\n");
}
return 0;
}