poj3414(bfs)

 

题目链接:http://poj.org/problem?id=3414

题意:给你两个容器 A  B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作。如果不能达到目标状态,则输出  impossible。

分析:这题跟hdu1495一样,需要分情况考虑,不过这里回溯输出路径。。。

具体分析情况看这里:http://www.tuicool.com/articles/fqeI3i

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
int a,b,c;
int ok,vis[110][110];
struct node
{
    int x,y;
    int step;
};
struct point
{
    int x,y,op;
}pre[110][110];
node make_node(int a,int b,int c)
{
    node temp;
    temp.x=a;temp.y=b;temp.step=c;
    return temp;
}
void path(int x,int y)
{
    if(x+y==0)
    {
        return ;
    }
    path(pre[x][y].x,pre[x][y].y);
    if(pre[x][y].op==1)
    {
        printf("FILL(1)\n");
        return;
    }
    if(pre[x][y].op==2)
    {
        printf("FILL(2)\n");
        return;
    }
    if(pre[x][y].op==3)
    {
        printf("DROP(1)\n");
        return;
    }
    if(pre[x][y].op==4)
    {
        printf("DROP(2)\n");
        return;
    }
    if(pre[x][y].op==5)
    {
        printf("POUR(2,1)\n");
        return;
    }
    if(pre[x][y].op==6)
    {
        printf("POUR(1,2)\n");
        return;
    }
}
void bfs()
{
    queue<node>que;
    while(!que.empty())que.pop();
    memset(vis,0,sizeof(vis));
    memset(pre,0,sizeof(pre));
    node cur,nxt;
    vis[0][0]=1;
    que.push(make_node(0,0,0));
    while(!que.empty())
    {
        cur=que.front();que.pop();
        if(cur.x==c||cur.y==c)
        {
            printf("%d\n",cur.step);
            path(cur.x,cur.y);ok=1;
            return;
        }//printf("%d %d\n",cur.x,cur.y);
        if(!vis[a][cur.y])
        {
            vis[a][cur.y]=1;
            pre[a][cur.y].x=cur.x;
            pre[a][cur.y].y=cur.y;
            pre[a][cur.y].op=1;
            que.push(make_node(a,cur.y,cur.step+1));
        }
        if(!vis[cur.x][b])
        {
            vis[cur.x][b]=1;
            pre[cur.x][b].x=cur.x;
            pre[cur.x][b].y=cur.y;
            pre[cur.x][b].op=2;
            que.push(make_node(cur.x,b,cur.step+1));
        }
        if(!vis[0][cur.y])
        {
            vis[0][cur.y]=1;
            pre[0][cur.y].x=cur.x;
            pre[0][cur.y].y=cur.y;
            pre[0][cur.y].op=3;
            que.push(make_node(0,cur.y,cur.step+1));
        }
        if(!vis[cur.x][0])
        {
            vis[cur.x][0]=1;
            pre[cur.x][0].x=cur.x;
            pre[cur.x][0].y=cur.y;
            pre[cur.x][0].op=4;
            que.push(make_node(cur.x,0,cur.step+1));
        }
        if(cur.x+cur.y<=a)
        {
            int xx=cur.x+cur.y,yy=0;
            if(!vis[xx][yy])
            {
                vis[xx][yy]=1;
                pre[xx][yy].x=cur.x;
                pre[xx][yy].y=cur.y;
                pre[xx][yy].op=5;
                que.push(make_node(xx,yy,cur.step+1));
            }
        }
        else
        {
            int xx=a,yy=cur.x+cur.y-a;
            if(!vis[xx][yy])
            {
                vis[xx][yy]=1;
                pre[xx][yy].x=cur.x;
                pre[xx][yy].y=cur.y;
                pre[xx][yy].op=5;
                que.push(make_node(xx,yy,cur.step+1));
            }
        }
        if(cur.x+cur.y<=b)
        {
            int xx=0,yy=cur.x+cur.y;
            if(!vis[xx][yy])
            {
                vis[xx][yy]=1;
                pre[xx][yy].x=cur.x;
                pre[xx][yy].y=cur.y;
                pre[xx][yy].op=6;
                que.push(make_node(xx,yy,cur.step+1));
            }
        }
        else
        {
            int xx=cur.x+cur.y-b,yy=b;
            if(!vis[xx][yy])
            {
                vis[xx][yy]=1;
                pre[xx][yy].x=cur.x;
                pre[xx][yy].y=cur.y;
                pre[xx][yy].op=6;
                que.push(make_node(xx,yy,cur.step+1));
            }
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&a,&b,&c)>0)
    {
        ok=0;
        bfs();
        if(ok==0)puts("impossible");
    }
}
View Code

 

posted on 2014-12-19 00:45  lienus  阅读(134)  评论(0编辑  收藏  举报

导航