HDU 1495(非常可乐)

广搜题,分为 6 种情况,s --> n,s --> m,n --> s,n --> m, m --> s,m --> n,使用三维数组记录访问情况。

#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 105;

bool vis[MAXN][MAXN][MAXN]; //访问情况
int s, n, m;

struct node 
{
    int s, n, m;
    int step; //次数
};

int BFS()
{
    if (s % 2 == 1)
        return -1;

    memset(vis, 0, sizeof(vis));
    int half = s / 2;
    queue<node> q;

    node now;
    now.s = s;
    now.n = 0;
    now.m = 0;
    now.step = 0;
    q.push(now);
    vis[now.s][now.n][now.m] = 1;

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

        if ((now.s == now.n && now.s == half) || (now.s == now.m && now.s == half) || (now.m == now.n && now.m == half))
            return now.step;

        node next;
        if (now.s && n - now.n > 0) // s --> n
        {
            if (now.s > n - now.n)
            {         
                next.s = now.s - (n - now.n);
                next.n = n;
                next.m = now.m;
            }
            else
            {
                next.s = 0;
                next.n = now.n + now.s;
                next.m = now.m;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
        
        if (now.s && m - now.m > 0) // s --> m
        {
            if (now.s > m - now.m)
            {
                next.s = now.s - (m - now.m);
                next.n = now.n;
                next.m = m;
            }
            else
            {
                next.s = 0;
                next.n = now.n;
                next.m = now.m + now.s;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
        
        if (now.n && s - now.s > 0) // n --> s
        {
            if (now.n > s - now.s) 
            {
                next.s = s;
                next.n = now.n - (s - now.s);
                next.m = now.m;
            }
            else 
            {
                next.s = now.s + now.n;
                next.n = 0;
                next.m = now.m;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
        
        if (now.n && m - now.m > 0) // n --> m
        {
            if (now.n > m - now.m)
            {
                next.s = now.s;
                next.n = now.n - (m - now.m);
                next.m = m;
            }
            else
            {
                next.s = now.s;
                next.n = 0;
                next.m = now.m + now.n;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
        
        if (now.m && s - now.s > 0) // m --> s
        {
            if (now.m > s - now.s)
            {
                next.s = s;
                next.n = now.n;
                next.m = now.m - (s - now.s);
            }
            else 
            {
                next.s = now.s + now.m;
                next.n = now.n;
                next.m = 0;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
        
        if (now.m && n - now.n > 0) // m --> n
        {
            if (now.m > n - now.n) 
            {
                next.s = now.s;
                next.n = n;
                next.m = now.m - (n - now.n);
            }
            else 
            {
                next.s = now.s;
                next.n = now.n + now.m;
                next.m = 0;
            }
            if (vis[next.s][next.n][next.m] == 0)
            {
                vis[next.s][next.n][next.m] = 1;
                next.step = now.step + 1;
                q.push(next);
            }
        }
    }
    return -1;
}

int main()
{
    while (cin >> s >> n >> m)
    {
        if (s == 0 && n == 0 && m == 0)
            break;

        int ans = BFS();

        if (ans < 0)
            cout << "NO" << endl;
        else
            cout << ans << endl;
    }
    return 0;
}

继续加油。

发布了332 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/105704907