poj3414 -Pots

 题解:总共是有6种可能,所以直接列出来bfs就可以,注意数据大小都在100一下。注意队列的大小

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
/*
题解,总共有六种情况,bfs
FILL(i)
FILL(j)
DROP(i)
DROP(j)
POUR(i,j)
POUR(j,i)
*/
using namespace std;
struct node
{
    int a;  //代表a的水
    int b;  //代表b的水
    int x;//从1到6代表六种种操作
    int per; //前驱
};
int main()
{
    int n,m,k;
    int i,j;
    int head,tail;
    int ans=-1;
    int vis[110][110];
    int f[1110];
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        memset(f,0,sizeof(f));
        struct node que[40000];
        head=0;
        tail=1;
        ans=-1;
        que[0].a=0;
        que[0].b=0;
        vis[0][0]=1;
        while(head<4000&&tail<399950)
        {
            int k1=que[head].a,k2=que[head].b;
            //1
            if(vis[n][k2]==0)
            {
                que[tail].a=n;
                que[tail].b=k2;
                que[tail].per=head;
                que[tail].x=1;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[n][k2]=1;
            }
            //2
            if(vis[k1][m]==0)
            {
                que[tail].a=k1;
                que[tail].b=m;
                que[tail].x=2;
                que[tail].per=head;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[k1][m]=1;
            }
            //3
            if(vis[0][k2]==0)
            {
                que[tail].a=0;
                que[tail].b=k2;
                que[tail].x=3;
                que[tail].per=head;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[0][k2]=1;
            }
            //4
            if(vis[k1][0]==0)
            {
                que[tail].a=k1;
                que[tail].b=0;
                que[tail].x=4;
                que[tail].per=head;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[k1][0]=1;
            }
            //5POUR(a,b)从a倒入b
            int temp=k1+k2;
            int newa,newb;
            if(temp>m)
            {
                newa=temp-m;
                newb=m;
            }
            else
            {
                newa=0;
                newb=temp;
            }
            if(vis[newa][newb]==0)
            {
                que[tail].a=newa;
                que[tail].b=newb;
                que[tail].x=5;
                que[tail].per=head;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[newa][newb]=1;
            }
            //6POUR(b,a)从b倒入a
            if(temp>n)
            {
                newa=n;
                newb=temp-n;
            }
            else
            {
                newa=temp;
                newb=0;
            }
            if(vis[newa][newb]==0)
            {
                que[tail].a=newa;
                que[tail].b=newb;
                que[tail].x=6;
                que[tail].per=head;
                if(que[tail].a==k||que[tail].b==k)
                {
                    ans=tail;
                    break;
                }
                tail++;
                vis[newa][newb]=1;
            }
            head++;
        }
        if(ans!=-1)
        {
            int sum=0,root=ans;
            while(root!=0)
            {
                f[sum]=que[root].x;
                sum++;
                root=que[root].per;
            }
            printf("%d\n",sum);
            for(i=sum-1; i>=0; i--)
            {
                if(f[i]==1)
                {
                    printf("FILL(1)\n");
                }
                if(f[i]==2)
                {
                    printf("FILL(2)\n");
                }
                if(f[i]==3)
                {
                    printf("DROP(1)\n");
                }
                if(f[i]==4)
                {
                    printf("DROP(2)\n");
                }
                if(f[i]==5)
                {
                    printf("POUR(1,2)\n");
                }
                if(f[i]==6)
                {
                    printf("POUR(2,1)\n");
                }
            }
        }
        else
        {
            printf("impossible\n");
        }

    }
}

猜你喜欢

转载自blog.csdn.net/xxf_is_girl_gad/article/details/90451341