Pots (广搜+回溯)

题目来源:https://vjudge.net/contest/159739#problem/H
【题意】
两只水杯,给出各自的容量,初始都没有存水,接着给出六种操作,问经过多次操作后,判断能不能到达一种给出的状态。
【思路】
利用结构体里定义二维字符串,每经过依次操作,都要把它上一步含有的所有操作全都复制下来,那么到最后找到的时候,里面存的就是正确的操作了。
【代码】

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
int vis[110][110];
int A,B,C;
struct djh
{
    int v1,v2,t;
    string str[120];
} q1,q2;
void bfs()
{
    queue q;
    q1.v1=0;
    q1.v2=0;
    q1.t=0;
    q.push(q1);
    vis[q1.v1][q1.v2]=1;
    while(!q.empty())
    {
        q1=q.front();
        q.pop();
        if(q1.v1==C||q1.v2==C)
        {
            printf("%d\n",q1.t);
            for(int i=1; i<=q1.t; i++)
                cout<.str[i]<;
            return;
        }
        if(q1.v1!=A)
        {

            q2=q1;
            q2.v1=A;
            q2.str[++q2.t]="FILL(1)";

            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
        if(q1.v2!=B)
        {
            q2=q1;
            q2.v2=B;
            q2.str[++q2.t]="FILL(2)";

            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
        if(q1.v1!=0)
        {
            q2=q1;
            q2.v1=0;
            q2.str[++q2.t]="DROP(1)";

            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
        if(q1.v2!=0)
        {
            q2=q1;
            q2.v2=0;
            q2.str[++q2.t]="DROP(2)";

            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
        if(q1.v1!=0&&q1.v2!=B)
        {
            q2=q1;
            int r=q2.v1+q2.v2;
            q2.v1=r>B?r-B:0;
            q2.v2=r>B?B:r;
            q2.str[++q2.t]="POUR(1,2)";

            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
        if(q1.v1!=A&&q1.v2!=0)
        {
            q2=q1;
            int r=q2.v1+q2.v2;
            q2.v2=r>A?r-A:0;
            q2.v1=r>A?A:r;
            q2.str[++q2.t]="POUR(2,1)";
            if(!vis[q2.v1][q2.v2])
            {
                vis[q2.v1][q2.v2]=1;
                q.push(q2);
            }
        }
    }
    printf("impossible\n");
    return ;
}
int main()
{
    scanf("%d%d%d",&A,&B,&C);
    bfs();
}

你可能感兴趣的:(ACM竞赛,【搜索】--广搜,ACM的进程)