POJ 3414 Pots

本文介绍了一个基于广度优先搜索(BFS)算法解决特定水壶问题的方法。通过保存节点状态及路径,实现了从初始状态到目标状态的转换,并能够回溯整个过程。代码中详细展示了如何进行状态转移及判断条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题是个BFS加了一点难度的题。

需要保存前一节点的在队列中的位置,操作等……

下面是代码:

#include <stdio.h>
#include <string.h>
int a,b,c;
bool vis[105][105];
struct node
{
    int x,y,pr;
    char s[10];
} qu[15000],du,dc;
char c1[10000][10];
int main()
{
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        memset(qu,0,sizeof(qu));
         memset(vis,0,sizeof(vis));
        int l=0,r=0,cut=0;
        du.x=0;
        du.y=0;
        du.pr=-1;
        strcpy(du.s,"begin");
        qu[r]=du;
        r++;
        vis[0][0]=1;
        int flat=0;
        while(l!=r)
        {
            du=qu[l];
            if(du.x==c||du.y==c)
            {
                flat=1;
                break;
            }
            if(du.x<a&&!vis[a][du.y])
            {
                vis[a][du.y]=1;
                dc.x=a;
                dc.y=du.y;
                dc.pr=l;
                strcpy(dc.s,"FILL(1)");
                qu[r]=dc;
                r++;
            }
            if(du.y<b&&!vis[du.x][b])
            {
                vis[du.x][b]=1;
                dc.x=du.x;
                dc.y=b;
                dc.pr=l;
                strcpy(dc.s,"FILL(2)");
                qu[r]=dc;
                r++;
            }
            if(du.x+du.y<=a&&!vis[du.x+du.y][0])
            {
                vis[du.x+du.y][0]=1;
                dc.x=du.x+du.y;
                dc.y=0;
                dc.pr=l;
                strcpy(dc.s,"POUR(2,1)");
                qu[r]=dc;
                r++;
            }
            if(du.y-a+du.x>0&&!vis[a][du.y-a+du.x])
            {
                vis[a][du.y-a+du.x]=1;
                dc.x=a;
                dc.y=du.y-a+du.x;
                dc.pr=l;
                strcpy(dc.s,"POUR(2,1)");
                qu[r]=dc;
                r++;
            }
            if(du.x+du.y<=b&&!vis[0][du.x+du.y])
            {
                vis[0][du.x+du.y]=1;
                dc.y=du.x+du.y;
                dc.x=0;
                dc.pr=l;
                strcpy(dc.s,"POUR(1,2)");
                qu[r]=dc;
                r++;
            }
            if(du.x-b+du.y>0&&!vis[du.x-b+du.y][b])
            {
                vis[du.x-b+du.y][b]=1;
                dc.y=b;
                dc.x=du.x-b+du.y;
                dc.pr=l;
                strcpy(dc.s,"POUR(1,2)");
                qu[r]=dc;
                r++;
            }
            if(du.x!=0&&!vis[0][du.y])
            {
                vis[0][du.y]=1;
                dc.x=0;
                dc.y=du.y;
                dc.pr=l;
                strcpy(dc.s,"DROP(1)");
                qu[r]=dc;
                r++;
            }
            if(du.y!=0&&!vis[du.x][0])
            {
                vis[du.y][0]=1;
                dc.y=0;
                dc.x=du.x;
                dc.pr=l;
                strcpy(dc.s,"DROP(2)");
                qu[r]=dc;
                r++;
            }
            l++;
        }
        if(flat)
        {
            int a;
            strcpy(c1[cut],du.s);
            a=du.pr;
            cut++;
            while(a!=-1)
            {
                du=qu[a];
                strcpy(c1[cut],du.s);
                a=du.pr;
                cut++;
            }
            printf("%d\n",cut-1);
            for(int i=cut-2;i>=0;i--)
            {
                puts(c1[i]);
            }
        }
        else
        {
            printf("impossible\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值