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

 

你可能感兴趣的:(poj)