POJ3414 Pots(BFS)

来源:互联网 发布:网游哪些数据可以修改 编辑:程序博客网 时间:2024/06/06 09:57

倒水问题。

题意:给两个杯子,容积分别为A和B。通过从水龙头接水(每次都接满),把杯里水全倒掉,把一个杯子里的水倒到另一个杯子里面三种操作使其中一个杯子里的水为C。

解题思路:6入口的BFS。难点在如何保存路径。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;bool vis[110][110];struct Node{    int x,y;    int step;    int fa;    int my;    int flag;} node[10010];queue<Node>q;void path(int u){    if(node[u].fa==-1)        return ;    path(node[u].fa);    if(node[u].flag==11)        printf("FILL(1)\n");    else if(node[u].flag==12)        printf("FILL(2)\n");    else if(node[u].flag==21)        printf("DROP(1)\n");    else if(node[u].flag==22)        printf("DROP(2)\n");    else if(node[u].flag==31)        printf("POUR(1,2)\n");    else if(node[u].flag==32)        printf("POUR(2,1)\n");}int main(){    int a,b,c,cnt;    //freopen("d:\\test.txt","r",stdin);    scanf("%d%d%d",&a,&b,&c);    memset(vis,false,sizeof(vis));    vis[0][0]=true;    cnt=0;    node[cnt].x=0,node[cnt].y=0,node[cnt].step=0,node[cnt].fa=-1,node[cnt].my=0;    cnt++;    q.push(node[0]);    Node t;    while(!q.empty())    {        t=q.front();        if(t.x==c ||t.y==c)            break;        q.pop();        if(t.x<a && !vis[a][t.y])        {            vis[a][t.y]=true;            node[cnt].x=a,node[cnt].y=t.y,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=11;            q.push(node[cnt]);            cnt++;        }        if(t.y<b && !vis[t.x][b])        {            vis[t.x][b]=true;            node[cnt].x=t.x,node[cnt].y=b,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=12;            q.push(node[cnt]);            cnt++;        }        if(t.x>0 && !vis[0][t.y])        {            vis[0][t.y]=true;            node[cnt].x=0,node[cnt].y=t.y,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=21;            q.push(node[cnt]);            cnt++;        }        if(t.y>0 &&!vis[t.x][0])        {            vis[t.x][0]=true;            node[cnt].x=t.x,node[cnt].y=0,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=22;            q.push(node[cnt]);            cnt++;        }        if(t.x>0 && t.y<b)        {            if(t.x>=b-t.y && !vis[t.x-b+t.y][b])            {                vis[t.x-b+t.y][b]=true;                node[cnt].x=t.x-b+t.y,node[cnt].y=b,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=31;                q.push(node[cnt]);                cnt++;            }            else if(t.x<b-t.y && !vis[0][t.y+t.x])            {                vis[0][t.y+t.x]=true;                node[cnt].x=0,node[cnt].y=t.y+t.x,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=31;                q.push(node[cnt]);                cnt++;            }        }        if(t.x<a && t.y>0)        {            if(t.y>=a-t.x && !vis[a][t.y-a+t.x])            {                vis[a][t.y-a+t.x]=true;                node[cnt].x=a,node[cnt].y=t.y-a+t.x,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=32;                q.push(node[cnt]);                cnt++;            }            else if(t.y<a-t.x && !vis[t.x+t.y][0])            {                vis[t.x+t.y][0]=true;                node[cnt].x=t.x+t.y,node[cnt].y=0,node[cnt].step=t.step+1,node[cnt].my=cnt,node[cnt].fa=t.my,node[cnt].flag=32;                q.push(node[cnt]);                cnt++;            }        }    }    if(q.empty())        printf("impossible\n");    else    {        printf("%d\n",t.step);        path(t.my);    }    return 0;}


0 0
原创粉丝点击