hdu 1495(bfs)

bfs分六种情况往下走,模拟倒的过程。

注意退出时必须是两个杯子均为s / 2,而不能是一个杯子,有可能另一半没汇聚到一个杯子里呢。WA了好几次...

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 110;
int s, n, m;
struct Node
{
    int a, b, ss;
    int step;
    Node()  {}
    Node(int x, int y, int z, int dep)
    {
        a = x;  b = y;  ss = z; step = dep;
    }
};
bool vis[maxn][maxn][maxn];


int bfs()
{
    queue<Node> q;
    q.push(Node(0, 0, s, 0));
    vis[0][0][s] = 1;

    while(!q.empty())
    {
        Node head = q.front();
        q.pop();

        int cura = head.a, curb = head.b, curs = head.ss;
        int step = head.step;
        //cout << cura << " " << curb << " " << curs << endl;

        if((cura == s / 2 && curb == s / 2) || (cura == s / 2 && curs == s / 2) || (curb == s / 2 && curs == s / 2))
        {
            return step;
        }

        int newa, newb, news;

        if(curs && cura != n)
        {
            if(curs + cura >= n)        //s - > a
            {
                newa = n;   news = curs + cura - n;    newb = curb;
            }
            else
            {
                newa = curs + cura;   news = 0;    newb = curb;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }

        if(curs && curb != m)
        {
            if(curs + curb >= m)                //s - > b
            {
                newa = cura;   news = curs + curb - m;    newb = m;
            }
            else
            {
                newa = cura;   news = 0;    newb = curs + curb;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }


        if(cura && curs != s)
        {
               
            if(cura + curs >= s)        //a - > s
            {
                newa = cura + curs - s;   news = s;    newb = curb;
            }
            else
            {
                newa = 0;   news = cura + curs;    newb = curb;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }

        if(cura && curb != m)
        {
            if(cura + curb >= m)                                //a - > b
            {
                newa = cura + curb - m; newb = m;   news = curs;
            }
            else
            {
                newa = 0;   newb = cura + curb; news = curs;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }


        if(curb && curs != s)
        {
                    
            if(curb + curs >= s)        //b - > s
            {
                newa = cura;   news = s;    newb = curb + curs - s;
            }
            else
            {
                newa = cura;   news = curb + curs;    newb = 0;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }

        if(curb && cura != n)
        {
            if(cura + curb >= n)                                //b - > a
            {
                newa = n; newb = cura + curb - n;   news = curs;
            }
            else
            {
                newa = cura + curb;   newb = 0; news = curs;
            }
            if(!vis[newa][newb][news])
            {
                q.push(Node(newa, newb, news, step + 1));
                vis[newa][newb][news] = 1;
            }
        }
    }
    return 0;
}


int main()
{
    while(scanf("%d%d%d", &s, &n, &m) == 3 && (s && n && m))
    {
        memset(vis, 0, sizeof(vis));
        if(s & 1)
        {
            printf("NO\n"); continue;
        }
        int ans = bfs();
        if(ans) printf("%d\n", ans);
        else    printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38577732/article/details/89323574