首页 > 代码库 > poj3414(bfs)

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 100010using 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

 

poj3414(bfs)