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;
}
原文地址:https://www.cnblogs.com/qioalu/p/5198529.html