zoukankan      html  css  js  c++  java
  • 状态目标bfs+哈希表 + 三杯水

    本篇文章是一篇关于状态目标的帖子

        给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间互相倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。当初要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
    输入
    第一行一个整数N(0<N<50)表现N组测试数据
    接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表现三个水杯的体积。
    第二行给出三个整数E1 E2 E3 (体积小于即是响应水杯体积)表现我们需要的终究状态
    输出
    每行输出响应测试数据最少的倒水次数。如果达不到目标状态输出-1

        

        

        #include<string.h>

        #include<stdlib.h>

        #include<ctype.h>

        #include<stdio.h>

        int visit[100][100][100];  //记录涌现过的状态

        int dis[1000];     //记录每种状态时候,到了多少次水

        int p[3];     //三瓶水的容量

        int a[1000][3];   //倒水状态

        int goal[3];     //目标状态

        void visited(int tmp[3]);

        int check(int tmp[3]);

        bool pour(int tmp[3],int i,int j)

        {

        if(tmp[i] ==0)

        return false;      //瓶子没有水了

        if(tmp[j] == p[j]) return false;    //另一个瓶子装满了水

        if(tmp[i] > (p[j]-tmp[j]))

        {

        tmp[i]-= (p[j]-tmp[j]);

        tmp[j] = p[j];

        }

        else

        {

        tmp[j] +=tmp[i];

        tmp[i] =0;

        }

        if(check(tmp))

        {

        return false;

        }

        else

        {

        visited(tmp);

        return true;

        }

        }

        每日一道理
    如果你们是蓝天,我愿做衬托的白云;如果你们是鲜花,我愿做陪伴的小草;如果你们是大树,我愿做点缀的绿叶……我真诚地希望我能成为你生活中一个欢乐的音符,为你的每一分钟带去祝福。

        int check(int tmp[3])   //查看是否涌现过状态

        {

        if(visit[tmp[0]][tmp[1]][tmp[2]])

        return 1;

        return 0;

        }

        void visited(int tmp[3])   //记录这种状态涌现过

        {

        visit[tmp[0]][tmp[1]][tmp[2]] = 1;

        }

        int bfs()

        {

        int i,j,k;

        int head=0,tail=1;

        visited(a[head]);   //记录初始状态为涌现过

        while(head <tail)

        {

        for(i=0;i<3;i++)

        if(a[head][i]!=goal[i]) break;

        if(i>=3) 

        return dis[head];    //与目标状态雷同

        for(i=0;i<3;i++)

        for(j=0;j<3;j++)

        {

        for(k=0;k<3;k++)      //查看第i层的下一个节点状态

        a[tail][k] = a[head][k];

        if(j!=i)

        if(pour(a[tail],i,j))

        {

        dis[tail] = dis[head]+1;

        tail++;     //入队列

        }

        }

        head++;   //出队列

        }

        return -1;

        }

        int main()

        {

        int count[100];

        int n;

        scanf("%d",&n);

        int i=-1;

        while(++i<n)

        {

        memset(a,0,sizeof(a));

        memset(dis,0,sizeof(dis));

        memset(visit,0,sizeof(visit));

        scanf("%d %d %d",&p[0],&p[1],&p[2]);

        scanf("%d %d %d",&goal[0],&goal[1],&goal[2]);

        a[0][0] = p[0];

        int min=bfs();

        count[i] = min;

        }

        for(i=0;i<n;i++)

        printf("%d\n",count[i]);

        return 1;

        }

    文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
    应聘者:JAVA
    面试官:知道什么叫类么
    应聘者:我这人实在,工作努力,不知道什么叫累
    面试官:知道什么是包?
    应聘者:我这人实在 平常不带包 也不用公司准备了
    面试官:知道什么是接口吗?
    应聘者:我这个人工作认真。从来不找借口偷懒
    面试官:知道什么是继承么
    应聘者:我是孤儿没什么可以继承的
    面试官:知道什么叫对象么?
    应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
    面试官:知道多态么?
    应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??

  • 相关阅读:
    Adventure C CF-665E(字典树、二进制)
    实验7投资问题
    Beautiful Array CF-1155D(DP)
    Salary Changing CF-1251D(二分)
    Beautiful Sets of Points CF-268C(乱搞)
    Vasya And Array CF1187C(构造)
    Tree Painting CF-1187E(换根DP)
    Vus the Cossack and Numbers CF-1186D(思维)
    Tree POJ-1741(点分治+树形DP)
    Magical Girl Haze 计蒜客-A1958(分层最短路)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3087208.html
Copyright © 2011-2022 走看看