zoukankan      html  css  js  c++  java
  • 调酒壶里的酸奶(bfs)

    题目描述

    最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"pub",那么他退而求次,想建一个"Yogurt shop",不能用酒,那用酸奶也行啊!
    今天女神终于来光顾小w的酸奶店了!兴奋的小w拿出自己准备已久每天都仔细擦干净的装备——调酒壶、果汁机、隔冰器和计量杯、砧板、小刀....准备露一手给女神看看
    但是女神却没有那么多耐心,女神只是觉得,自己买一瓶大酸奶喝不完,小瓶酸奶不够喝,所以在小w的酸奶店,说不定她可以想买多少就买多少。
    于是女神告诉了小w她想要多少体积的酸奶,而小w却依旧想秀一下自己的操作,于是他决定用仅有的两个调酒壶为女神倒出女神想要的酸奶....
    小w的两个调酒壶体积是不同的(一开始都是空的),小w每次可以选择一个调酒壶倒入另一个调酒壶(若A倒入B,A倒完或B倒满则停止),或者选择一个调酒壶倒光,或者选择一个调酒壶去接满酸奶.....
    满心失望的小w想找一朵花,一瓣一瓣的撕下来,问问花朵女神到底喜不喜欢他...虽然这个答案是显而易见的,但是他还是想找一朵花...然而找花未果,反正花瓣不是偶数就是奇数,那他索性就用自己的操作次数作为花瓣个数吧!(找不到花我还不能脑补一朵吗...)
    但是小w已经没有心情去想答案了...那么你能告诉他,需要多少步操作才能倒出女神想要的酸奶吗?

    输入

    输入包含多组数据,每行三个正整数a,b,c分别表示两个调酒壶的容量以及女神想要的酸奶体积,a,b的范围都在[0,100],c<=max(a,b)   

    输出

    一行包含一个整数表示完成要求的最少操作次数,若达不到则输出"impossible"(没有双引号)

    样例输入

    复制样例数据

    10 15 11
    6 5 4

    样例输出

    impossible
    4
    

    提示

     我不知道为什么酸奶可以倒进调酒壶,我也不知道为什么女神不喜欢小w,我只知道凭小w的想象力,游泳池都行更别说一朵花了!

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    int a,b,c;
    int v[200][200],d[200][200];
    struct note{
        int a,b;
    };
    int bfs(){
        queue<note>q;
        memset(v,0,sizeof v);
        memset(d,0,sizeof d);
        d[0][0]=0;
        v[0][0]=1;
        note t;
        t.a=0,t.b=0;
        q.push(t);
        while(!q.empty()){
            note m=q.front();
            q.pop();
            for(int i=1;i<=6;i++){
                int x,y;
                if(i==1){
                    x=a;
                    y=m.b;
                }
                if(i==2){
                    x=m.a;
                    y=b;
                }
                if(i==3){
                    x=0;
                    y=m.b;
                }
                if(i==4){
                    x=m.a;
                    y=0;
                }
                if(i==5){
                    x=m.a+m.b;
                    if(x>=b){
                        x=x-b;
                    }
                    else x=0;
                    y=m.a+m.b;
                    if(y>=b){
                        y=b;
                    }
                }
                if(i==6){
                    x=m.a+m.b;
                    if(x>=a){
                        x=a;
                    }
                    y=m.a+m.b;
                    if(y>=a){
                        y-=a;
                    }
                    else y=0;
                }
                if(!v[x][y]){
                    v[x][y]=1;
                    d[x][y]=d[m.a][m.b]+1;
                    if(x==c||y==c) return d[x][y];
                    note p;
                    p.a=x;
                    p.b=y;
                    q.push(p);
                }
            }
        }
        return -1;
    }
    int main()
    {
        while(~scanf("%d%d%d",&a,&b,&c)){
            int ans=bfs();
            if(ans==-1) printf("impossible
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319512.html
Copyright © 2011-2022 走看看