• 调酒壶里的酸奶(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;
    }
    
  • 相关阅读:
    mysql常用命令
    怎么在cmd中输入mysql就可以进去mysql控制台
    ORA-01659: 无法分配超出 7 的 MINEXTENTS
    Oracle修改表空间自增长
    整理下.net分布式系统架构的思路
    Net分布式系统之一:系统整体框架介绍
    QT QTreeWidget 的一个例子 显示文件(夹)的树形结构
    待读 QT 博客
    如何为 QT5 装上 QT4 才有的库
    Python 获取文件夹里所有 log 的起止时间戳
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319512.html
Copyright © 2020-2023  润新知