poj 3414

本文介绍了一种使用广度优先搜索(BFS)解决水罐问题的方法,并提供了详细的 C++ 代码实现。通过六个基本操作状态转移,实现了从初始状态到目标状态的路径寻找。

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
const int maxn = 100 + 10;
int A,B,C;
int vis[maxn][maxn];
struct node{
    int a,b,step;
    char str[111][111];
};
bool bfs(){
    queue<node>qq;
    memset(vis,-1,sizeof(vis));
    node tmp;
    tmp.a=0,tmp.b=0,tmp.step=0;
    qq.push(tmp);
    vis[0][0]=1;
    while(!qq.empty()){
        tmp=qq.front();
        qq.pop();
        node t;

        if(tmp.a==C||tmp.b==C){
                printf("%d\n",tmp.step);
            for(int i=1;i<=tmp.step;i++)printf("%s\n",tmp.str[i]);
            return true;
        }



        //1
        t=tmp;
        t.a=0;
        t.b=tmp.b;
        t.step=tmp.step+1;
        strcpy(t.str[t.step],"DROP(1)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }


        //2
        t=tmp;
        t.b=0;
        t.a=tmp.a;
        t.step=tmp.step+1;
        strcpy(t.str[t.step],"DROP(2)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }





         //3
        t=tmp;
        t.a=A;
        t.b=tmp.b;

        t.step=tmp.step+1;
        strcpy(t.str[t.step],"FILL(1)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }




        //4
        t=tmp;
        t.a=tmp.a;
        t.b=B;
        t.step=tmp.step+1;
        strcpy(t.str[t.step],"FILL(2)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }

        //5
        t=tmp;
        t.a=min(A,tmp.a+tmp.b);
        t.b=tmp.a+tmp.b-t.a;
        t.step=tmp.step+1;
        strcpy(t.str[t.step],"POUR(2,1)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }




        //6
        t=tmp;
        t.b=min(B,tmp.a+tmp.b);
        t.a=tmp.a+tmp.b-t.b;
        t.step=tmp.step+1;
        strcpy(t.str[t.step],"POUR(1,2)");
        if(vis[t.a][t.b]==-1){
            vis[t.a][t.b]=1;
            qq.push(t);
        }

    }
    return false;
}
int main(){

    while(~scanf("%d%d%d",&A,&B,&C)){
        if(!bfs())printf("impossible\n");

    }
}

这个题不算难

分六个状态讨论就行了

直接上代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值