天梯刷题2: Pots POJ - 3414

题目链接:https://vjudge.net/problem/POJ-3414
题解:此题是判断几步之后最快能到达最终状态,典型的bfs。
需要注意:1.开始的杯子是空的
2.储存步骤的新方法:结构体定义string来储存步骤编号和序数,string数组来表达
代码:

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iomanip>
#include<string>
#define maxn 10100
using namespace std;
typedef  pair<int,int> P;
string str[10]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};//空出第一个是为了区分
int a,b,k;
class C
{
    public:
    int bu;//步数
    int fr,en;//第一个桶和第二个桶
    string s;//存储步骤的个数和标志//s.length是步骤的个数,s[i]是步骤的长度
    C(int f,int e,int b,string ss):fr(f),en(e),bu(b),s(ss){}
};
queue<C>que;
int v[110][110];
void bfs()
{
    int xu=0;
    int ff=0;
    v[a][b]=1;
    que.push(C(0,0,0,""));
    while(!que.empty())
    {
        C c=que.front();
        que.pop();
        int va=c.fr;
        int vb=c.en;
        int step=c.bu;
        if(va==k||vb==k)//循环终止的条件
        {
            ff=1;
            cout<<c.bu<<endl;
            for(int i=0;i<c.s.length();i++)
            {
                cout<<str[c.s[i]-'0']<<endl;
            }
            break;
        }
        if(va<a&&v[a][vb]==0)//装满a
        {
            v[a][vb]=1;//已经被用过
            que.push(C(a,vb,step+1,c.s+"1"));
        }
        if(vb<b&&v[va][b]==0)//装满b
        {
            v[va][b]=1;
            que.push(C(va,b,step+1,c.s+"2"));
        }
        if(va!=0&&v[0][vb]==0)//拿出a
        {
            v[0][vb]=1;
            que.push(C(0,vb,step+1,c.s+"3"));
        }
        if(vb!=0&&v[va][0]==0)//拿出b
        {
            v[va][0]=1;
            que.push(C(va,0,step+1,c.s+"4"));
        }
        if(vb!=b)//a放进b
        {
            if(va+vb<=b&&v[0][va+vb]==0)//装不满
            {
                v[0][va+vb]=1;
                que.push(C(0,va+vb,step+1,c.s+"5"));
            }
            if(va+vb>b&&v[va-(b-vb)][b]==0)
            {
                v[va-(b-vb)][b]=1;
                que.push(C(va+vb-b,b,step+1,c.s+"5"));
            }
        }
        if(va!=a)//b放进a
        {
            if(va+vb<=a&&v[va+vb][0]==0)//装不满
            {
                v[va+vb][0]=1;
                que.push(C(va+vb,0,step+1,c.s+"6"));
            }
            if(va+vb>a&&v[a][vb+va-a]==0)
            {
                v[a][vb+va-a]=1;
                que.push(C(a,vb+va-a,step+1,c.s+"6"));
            }
        }
    }
    if(!ff)
        cout<<"impossible"<<endl;
}
int main()
{
    while(!que.empty())
        que.pop();
    memset(v,0,sizeof(v));
    cin>>a>>b>>k;
    bfs();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值