非常可樂 HDU - 1495

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章