zoukankan      html  css  js  c++  java
  • POJ 3414

    宝宝好激动、、、、A个题越来越不易了、、

    题意:很经典的小游戏,给你两个杯子和足够的水,问你能不能用这两个杯子量出题目中要求的水的容积;哈哈,有了这个程序以后玩这种小游戏就可以快速找到最佳方案啦啦啦啦

    方法,bfs搜索,搜索的对象是两个杯子的状态;每次只能进行一次操作,共有六种可能,用vis数组标记一下是否这种状态已经出现过

    get的新技能:如果要记录路径的话可以开一个数组,要记录字符串的话就是二维数组啦;

    宝宝写的代码:

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    using namespace std;
    
    struct node
    {
        int x;
        int y;
        int z;
        char str[155][155];
    };
    int a,b,c;
    
    queue<node>q;
    
    void bfs()
    {
        int vis[111][111];
        memset(vis,0,sizeof(vis));
        vis[0][0]=1;
        while(!q.empty())
        {
            node n;
            n=q.front();
            q.pop();
            if(n.x==c||n.y==c)
            {
                printf("%d
    ",n.z);
                for(int i=1; i<=n.z; i++)
                {
                    printf("%s
    ",n.str[i]);
                }
                return ;
            }
            node k;
            k=n;
            k.x=0;
            k.z++;
            strcpy(k.str[k.z],"DROP(1)");
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
            k=n;
            k.y=0;
            k.z++;
            strcpy(k.str[k.z],"DROP(2)");
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
            k=n;
            k.x=a;
            k.z++;
            strcpy(k.str[k.z],"FILL(1)");
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
            k=n;
            k.y=b;
            k.z++;
            strcpy(k.str[k.z],"FILL(2)");
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
            if((n.x + n.y)<a)
            {
                k=n;
                k.x= n.x + n.y;
                k.y=0;
                k.z++;
                strcpy(k.str[k.z],"POUR(2,1)");
            }
            else
            {
                k=n;
                k.x=a;
                k.y= n.y+n.x-a;
                k.z++;
                strcpy(k.str[k.z],"POUR(2,1)");
            }
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
            if((n.y+n.x)<b)
            {
                k=n;
                k.y=n.x + n.y;
                k.x=0;
                k.z++;
                strcpy(k.str[k.z],"POUR(1,2)");
            }
            else
            {
                k=n;
                k.y=b;
                k.x=n.x+n.y-b;
                k.z++;
                strcpy(k.str[k.z],"POUR(1,2)");
            }
            if(vis[k.x][k.y]==0)
            {
                vis[k.x][k.y]=1;
                q.push(k);
            }
        }
        printf("impossible
    ");
        return ;
    }
    
    int main()
    {
        while(~scanf("%d%d%d",&a,&b,&c))
        {
            node n1;
            n1.x=a;
            n1.y=0;
            strcpy(n1.str[1],"FILL(1)");
            node n2;
            n2.x=0;
            n2.y=b;
            strcpy(n2.str[1],"FILL(2)");
            n1.z=1;
            n2.z=1;
            q.push(n1);
            q.push(n2);
            bfs();
        }
        return 0;
    }
  • 相关阅读:
    (转)Apache与Tomcat 区别联系
    (转)JAVA排序汇总
    (转)Java线程:大总结
    (转)Java线程:新特征-原子量,障碍器
    (转)Java线程:新特征-条件变量
    oracle中的not in和not exists注意事项
    oracle字符乱码的解决方法
    线刷和卡刷的区别
    nexus5刷机
    linux上复制行到另一个文件
  • 原文地址:https://www.cnblogs.com/qioalu/p/5198529.html
Copyright © 2011-2022 走看看