poj-3414-bfs

题意:

给你三个数:a,b,c

让你通过一系列的动作,初始时,A=B=0;使得A=c或者B=c;

动作:

1,A=a;

2,B=b;

3,A=0;B=B;

4,A=A,B=0;

5,A=(B往A中走,最大不超过a),B=走剩下的。

6,B=(A往B中走,最大不超过b),A=走剩下的。

做法:

总共就有6中情况,bfs就行。注意当A,B都满了的时候,不走5,6;

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct list
{
    int x;
    int y;
    int vis[1000];
    int step;
}p,pp;
int a,b,c;
queue<struct list>q;
int visit[101][101];
void change(int x,int y,int z)
{
    if(!visit[x][y])
    {
        visit[x][y]=1;
        pp=p;
        pp.x=x;
        pp.y=y;
        pp.vis[++pp.step]=z;
        q.push(pp);
    }
}
void put()
{
    int i;
    printf("%d\n",p.step);
    for(i=1;i<=p.step;i++)
    {
        switch(p.vis[i])
        {
            case 1:printf("FILL(%d)\n",1);break;
            case 2:printf("FILL(%d)\n",2);break;
            case 3:printf("DROP(%d)\n",1);break;
            case 4:printf("DROP(%d)\n",2);break;
            case 5:printf("POUR(%d,%d)\n",1,2);break;
            case 6:printf("POUR(%d,%d)\n",2,1);break;
        }
    }
}
int main()
{
    cin>>a>>b>>c;
    memset(visit,0,sizeof(visit));
    p.x=0;
    p.y=0;
    p.step=0;
    p.vis[0]=0;
    visit[0][0]=1;
    q.push(p);
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        if(p.x==c||p.y==c)
        {
            put();
            return 0;
        }
        change(a,p.y,1);
        change(p.x,b,2);
        change(0,p.y,3);
        change(p.x,0,4);
        int xx,yy;
        if(p.x==a&&p.y==b)continue;
        if(p.x+p.y>a)xx=a,yy=p.y-a+p.x;
        else xx=p.x+p.y,yy=0;
        change(xx,yy,6);
        if(p.x+p.y>b)
        {
            xx=p.x-b+p.y,yy=b;
        }
        else xx=0,yy=p.x+p.y;
        change(xx,yy,5);
    }
    printf("impossible\n");
    return 0;
}
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值