POJ 3414 Pots

来源:互联网 发布:ci js中图片路径 编辑:程序博客网 时间:2024/05/16 15:01

这个题是个BFS加了一点难度的题。

需要保存前一节点的在队列中的位置,操作等……

下面是代码:

#include <stdio.h>#include <string.h>int a,b,c;bool vis[105][105];struct node{    int x,y,pr;    char s[10];} qu[15000],du,dc;char c1[10000][10];int main(){    while(scanf("%d%d%d",&a,&b,&c)!=EOF)    {        memset(qu,0,sizeof(qu));         memset(vis,0,sizeof(vis));        int l=0,r=0,cut=0;        du.x=0;        du.y=0;        du.pr=-1;        strcpy(du.s,"begin");        qu[r]=du;        r++;        vis[0][0]=1;        int flat=0;        while(l!=r)        {            du=qu[l];            if(du.x==c||du.y==c)            {                flat=1;                break;            }            if(du.x<a&&!vis[a][du.y])            {                vis[a][du.y]=1;                dc.x=a;                dc.y=du.y;                dc.pr=l;                strcpy(dc.s,"FILL(1)");                qu[r]=dc;                r++;            }            if(du.y<b&&!vis[du.x][b])            {                vis[du.x][b]=1;                dc.x=du.x;                dc.y=b;                dc.pr=l;                strcpy(dc.s,"FILL(2)");                qu[r]=dc;                r++;            }            if(du.x+du.y<=a&&!vis[du.x+du.y][0])            {                vis[du.x+du.y][0]=1;                dc.x=du.x+du.y;                dc.y=0;                dc.pr=l;                strcpy(dc.s,"POUR(2,1)");                qu[r]=dc;                r++;            }            if(du.y-a+du.x>0&&!vis[a][du.y-a+du.x])            {                vis[a][du.y-a+du.x]=1;                dc.x=a;                dc.y=du.y-a+du.x;                dc.pr=l;                strcpy(dc.s,"POUR(2,1)");                qu[r]=dc;                r++;            }            if(du.x+du.y<=b&&!vis[0][du.x+du.y])            {                vis[0][du.x+du.y]=1;                dc.y=du.x+du.y;                dc.x=0;                dc.pr=l;                strcpy(dc.s,"POUR(1,2)");                qu[r]=dc;                r++;            }            if(du.x-b+du.y>0&&!vis[du.x-b+du.y][b])            {                vis[du.x-b+du.y][b]=1;                dc.y=b;                dc.x=du.x-b+du.y;                dc.pr=l;                strcpy(dc.s,"POUR(1,2)");                qu[r]=dc;                r++;            }            if(du.x!=0&&!vis[0][du.y])            {                vis[0][du.y]=1;                dc.x=0;                dc.y=du.y;                dc.pr=l;                strcpy(dc.s,"DROP(1)");                qu[r]=dc;                r++;            }            if(du.y!=0&&!vis[du.x][0])            {                vis[du.y][0]=1;                dc.y=0;                dc.x=du.x;                dc.pr=l;                strcpy(dc.s,"DROP(2)");                qu[r]=dc;                r++;            }            l++;        }        if(flat)        {            int a;            strcpy(c1[cut],du.s);            a=du.pr;            cut++;            while(a!=-1)            {                du=qu[a];                strcpy(c1[cut],du.s);                a=du.pr;                cut++;            }            printf("%d\n",cut-1);            for(int i=cut-2;i>=0;i--)            {                puts(c1[i]);            }        }        else        {            printf("impossible\n");        }    }    return 0;}


原创粉丝点击