zoukankan      html  css  js  c++  java
  • 三个水杯(BFS)

    三个水杯

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
    描写叙述
    给出三个水杯。大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子。

    三个水杯之间相互倒水,而且水杯没有标识,仅仅能依据给出的水杯体积来计算。

    如今要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

    输入
    第一行一个整数N(0<N<50)表示N组測试数据
    接下来每组測试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
    第二行给出三个整数E1 E2 E3 (体积小于等于对应水杯体积)表示我们须要的终于状态
    输出
    每行输出对应測试数据最少的倒水次数。

    假设达不到目标状态输出-1

    例子输入
    2
    6 3 1
    4 1 1
    9 3 2
    7 1 1
    例子输出
    3
    -1
    来源

    经典题目


    #include <iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    int N;
    int v1,v2,v3,vis[100][100][100],E1,E2,E3;
    struct p
    {
        int x,y,z;
    };
    p f[100][100][100];
    using namespace std;
    queue<p>v;
    p u;
    void fq(p u,p &t)
    {
        if(!vis[t.x][t.y][t.z])
        {
            v.push(t);
            vis[t.x][t.y][t.z]=1;
            f[t.x][t.y][t.z].x=u.x;
            f[t.x][t.y][t.z].y=u.y;
            f[t.x][t.y][t.z].z=u.z;
        }
        t=u;
    }
    int main()
    {
        scanf("%d",&N);
        while(N--)
        {
            scanf("%d%d%d%d%d%d",&v1,&v2,&v3,&E1,&E2,&E3);
            memset(vis,0,sizeof(vis));
            u.x=u.y=u.z=0;
            if(v1>v2&&v1>v3)u.x=v1;
            if(v2>v1&&v2>v3)u.y=v2;
            if(v3>v2&&v3>v1)u.z=v3;
            vis[u.x][u.y][u.z]=1;
            while(!v.empty())v.pop();
            v.push(u);
            int flag=0;
            f[u.x][u.y][u.z].x=u.x;
            f[u.x][u.y][u.z].y=u.y;
            f[u.x][u.y][u.z].z=u.z;
    
            while(!v.empty())
            {
                u=v.front();
                v.pop();
                p t=u;
                if(u.x==E1&&u.y==E2&&u.z==E3)
                {
    
                    flag=1;break;
                }
                if(t.x+t.y<=v2)
                {
                    t.y+=t.x;
                    t.x=0;
                }
                else
                {
                    t.x-=(v2-t.y);
                    t.y=v2;
                }
                fq(u,t);
                if(t.x+t.z<=v3)
                {
                    t.z+=t.x;
                    t.x=0;
                }
                else
                {
                    t.x-=(v3-t.z);
                    t.z=v3;
                }
                fq(u,t);
                if(t.y+t.x<=v1)
                {
                    t.x+=t.y;
                    t.y=0;
                }
                else
                {
                    t.y-=(v1-t.x);
                    t.x=v1;
                }
                fq(u,t);
                if(t.y+t.z<=v3)
                {
                    t.z+=t.y;
                    t.y=0;
                }
                else
                {
                    t.y-=(v3-t.z);
                    t.z=v3;
                }
                fq(u,t);
                if(t.z+t.x<=v1)
                {
                    t.x+=t.z;
                    t.z=0;
                }
                else
                {
                    t.z-=(v1-t.x);
                    t.x=v1;
                }
                fq(u,t);
                if(t.z+t.y<=v2)
                {
                    t.y+=t.z;
                    t.z=0;
                }
                else
                {
                    t.z-=(v2-t.y);
                    t.y=v2;
                }
                fq(u,t);
            }
            if(!flag)puts("-1");
            else
            {
                int A=0;
                u.x=E1,u.y=E2,u.z=E3;
                while(!(f[u.x][u.y][u.z].x==u.x&&f[u.x][u.y][u.z].y==u.y&&f[u.x][u.y][u.z].z==u.z))
                {
    
                    p t=u;
                    u.x=f[t.x][t.y][t.z].x;
                    u.y=f[t.x][t.y][t.z].y;
                    u.z=f[t.x][t.y][t.z].z;
                    A++;
                }
                printf("%d
    ",A);
            }
    
        }
        return 0;
    }
    


  • 相关阅读:
    1155 Heap Paths (30 分)
    1147 Heaps (30 分)
    1098 Insertion or Heap Sort (25 分)
    12.SpringMVC 获得 请求头信息
    11.SpringMVC 获得Servlet相关API
    10.SpringMVC 自定义类型转换器
    18. VUE 数组的响应式
    017 vue 关于 v-for 指令内部算法
    17. VUE v-show 和 v-if 的区别
    16. VUE 的 小案列
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7026833.html
Copyright © 2011-2022 走看看