M - 非常可乐

时间:2021-10-09 12:08:50
很明显看出来的广搜题目,不过因为有3个杯子相互倾倒,所以会产生6种倒发,比较冗杂,不过应该可以构造一个数组来解决这个问题,试试看吧
//////////////////////////////////////////////////////////////////
果然是可以的,用一个数组替代然后使用下标去表示

#include<queue>

#include<stdio.h>
#include<string.h>
using namespace std; const int maxn = ;
const int oo = 0xfffffff; struct node{int cup[], step;};
node q;
int Full[];
int dir[][] = { {,},{,},{,},{,},{,},{,} };
int v[maxn][maxn][maxn]; void Turn(int &a, int &b, int FullB)//把瓶子a里面的水倒入瓶子B
{
    if(a+b <= FullB)
        b += a, a=;
    else
    {
        a -= (FullB-b);
        b = FullB;
    }
}
int OK(node s)//判断是否已经分好
{
    if(s.cup[]+s.cup[] == Full[] && s.cup[] == s.cup[])
        return ;
    if(s.cup[]+s.cup[] == Full[] && s.cup[] == s.cup[])
        return ;
    if(s.cup[]+s.cup[] == Full[] && s.cup[] == s.cup[])
        return ;     return ;
}
int Bfs(node s)
{
    queue<node> Q;
    Q.push(s);     while(Q.size())
    {
        s = Q.front();Q.pop();         if(OK(s))
            return s.step;         for(int i=; i<; i++)
        {
            q = s;
            Turn(q.cup[ dir[i][] ], q.cup[ dir[i][] ], Full[dir[i][]]);             if(v[q.cup[]][q.cup[]][q.cup[]] == )
            {
                v[q.cup[]][q.cup[]][q.cup[]] = ;
                q.step++;
                Q.push(q);
            }
        }
    }     return -;
} int main()
{
    node s;     while(scanf("%d%d%d", &Full[], &Full[], &Full[]), Full[]+Full[]+Full[])
    {
        memset(v, , sizeof(v));         s.cup[] = Full[];
        s.cup[]=s.cup[]=s.step=;
        int ans = Bfs(s);         if(ans == -)
            printf("NO\n");
        else
            printf("%d\n", ans);
    }     return ;
}