POJ 3414 Pots

这个题是个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;
}


posted @ 2013-08-21 10:37  、小呆  阅读(89)  评论(0编辑  收藏  举报