非常可乐 (广搜(简单倒水问题))

题目来源:https://vjudge.net/contest/159739#problem/M
【题意】
汉语意思不再解释。
【思路】
简单倒水问题,拥有三个杯子(一个瓶子),相互倒水,只有最后的状态是两只瓶子拥有一样的水,另一个瓶子没有,就可以了。
【代码】

#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 vs,va,vb;
bool vis[104][104][104];
struct pp
{
    int s,a,b,t;
} q1,q2;
void bfs()
{
    queue q;
    q1.s=vs,q1.a=0,q1.b=0;
    q1.t=0;
    vis[vs][0][0]=1;
    q.push(q1);
    while(!q.empty())
    {
        q1=q.front();
        q.pop();
        if((!q1.s&&q1.a==q1.b)||(!q1.a&&q1.s==q1.b)||(!q1.b&&q1.a==q1.s))
        {
            printf("%d\n",q1.t);
            return ;
        }
        for(int i=0; i<6; i++)
        {
            if(i==0)
            {
                q2=q1;
                int v=q1.s+q1.a;
                q2.a=v>va?va:v;
                q2.s=v>va?(v-va):0;
            }
            else if(i==1)
            {
                q2=q1;
                int v=q1.s+q1.a;
                q2.s=v>vs?vs:v;
                q2.a=v>vs?(v-vs):0;
            }
            else if(i==2)
            {
                q2=q1;
                int v=q1.s+q1.b;
                q2.b=v>vb?vb:v;
                q2.s=v>vb?(v-vb):0;
            }
            else if(i==3)
            {
                q2=q1;
                int v=q1.s+q1.b;
                q2.s=v>vs?vs:v;
                q2.b=v>vs?(v-vs):0;
            }
            else if(i==4)
            {
                q2=q1;
                int v=q1.a+q1.b;
                q2.a=v>vb?(v-vb):0;
                q2.b=v>vb?vb:v;
            }
            else if(i==5)
            {
                q2=q1;
                int v=q1.a+q1.b;
                q2.a=v>va?va:v;
                q2.b=v>va?(v-va):0;
            }
            if(!vis[q2.s][q2.a][q2.b])
            {
                q2.t++;
                vis[q2.s][q2.a][q2.b]=1;
                q.push(q2);
            }
        }
    }
    puts("NO");
}
int main()
{
    while(~scanf("%d%d%d",&vs,&va,&vb))
    {
        if(!vs&&!va&&!vb)
            break;
        if(vs&1)
        {
            puts("NO");
            continue;
        }
        mem(vis,0);
        bfs();
    }
}

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