HDU1495 非常可樂

來源:互聯網
上載者:User
                                                      
非常可樂
時間限制: Java: 2000 ms / Others: 1000 ms
記憶體限制: Java: 32768 KB / Others: 32768 KB
問題描述大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可樂的體積為S (S<101)毫升 (正好裝滿一瓶) ,它們三個之間可以相互倒可樂 (都是沒有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聰明的ACMER你們說他們能平分嗎?如果能請輸出倒可樂的最少的次數,如果不能輸出"NO"。輸入說明三個整數 : S 可樂的體積 , N 和 M是兩個杯子的容量,以"0 0 0"結束。 輸出說明如果能平分的話請輸出最少要倒的次數,否則輸出"NO"。 輸入範例
7 4 34 1 30 0 0
輸出範例
NO3
來源seeyou

解題思路:本題用廣度優先搜尋解答,就是3個容器,容量為S,N,M,其中S中裝滿可樂,要把可樂平分到2個容器,求最短路勁。
                    用標記數組flag[105][105][105]標記已出現過的狀態,再次出現時不入隊,剪枝。搜尋時就把3個容器裡的可樂倒來倒去就行了,一但遇到合格,直接跳出搜尋,輸出答案即可。

#include<cstdio>#include<cstring>#include<queue>using namespace std;int flag[105][105][105];int s,n,m;double av;struct node{    int x;    int y;    int z;    int step;};void dao(int &x,int max_x,int &y,int max_y) //把x中得可樂倒到y中{    if(x==0||y==max_y)   //無法倒,不處理        return ;    y+=x;   //全部倒進去    x=0;    if(y>max_y) //y溢出    {        x=y-max_y;        y=max_y;    }}bool ok(int x,int y,int z){    int k=0;    if(x==av)    k++;    if(y==av)    k++;    if(z==av)    k++;    if(k==2)    return true;    return false;}int bfs(){    node first,next;    queue<node> q;    first.x=s;    first.y=0;    first.z=0;    first.step=0;    q.push(first);    flag[first.x][first.y][first.z]=1;    while(!q.empty())    {        //printf("first.x=%d  first.y=%d  first.z=%d  first.step\n",first.x,first.y,first.z,first.step);        first=q.front();        q.pop();        next.step=first.step+1;        //x->y        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.x,s,next.y,n);        if(ok(next.x,next.y,next.z)) //已經平分到2個容器            return next.step;        if(!flag[next.x][next.y][next.z]) //該情況為現過            flag[next.x][next.y][next.z]=1,q.push(next);        //x->z        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.x,s,next.z,m);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //y->x        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.y,n,next.x,s);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //y->z        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.y,n,next.z,m);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //z->x        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.z,m,next.x,s);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //z->y        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.z,m,next.y,n);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);    }    return -1;}int main(){    while(scanf("%d%d%d",&s,&n,&m)&&s)    {        memset(flag,0,sizeof(flag));        av=(double)s/2;        if(s%2!=0)            printf("NO\n");        else        {            int k=bfs();            if(k==-1)                printf("NO\n");            else                printf("%d\n",k);        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.