hdu1495~廣搜

思路:
其實就是要判斷可樂能不能被平分……..

有六種狀態,從a瓶到b瓶,a–>c

b–>a b–>c

c–>a c–>b

然後每種狀態裏面又分兩種不同情況,可以將此瓶的水全部清空,不能清空……

然後廣搜就可以了……..

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

int vist[105][105][105];
int a, b, c;
struct node
{
    int a, b, c;
    int step;
}s[105];
int sum = 0;
int bfs();
int main()
{
    while (scanf_s("%d %d %d", &a, &b, &c) != EOF && (a + b + c))
    {
        if (a % 2 == 1)
        {
            printf("NO\n");
            continue;
        }
        int ans = bfs();
        if (ans >= 0)
            printf("%d\n", ans);
        else
            printf("NO\n");
    }
    return 0;
}
int  bfs()
{
    queue<node>q;
    memset(vist, 0, sizeof(vist));
    node p1;
    p1.a = a;
    p1.b = 0;
    p1.c = 0;
    p1.step = 0;
    q.push(p1);
    vist[p1.a][0][0] = 1;
    while (!q.empty())
    {
        p1 = q.front();
        q.pop();
        if ((p1.a == a / 2 && p1.b == a / 2) || (p1.a == a / 2 && p1.c == a / 2) || (p1.b == a / 2 && p1.c == a / 2))   //如果平分就返回步數
        {
            return p1.step;
        }
        node p2;
        if (p1.a != 0)
        {
            if (p1.a > b - p1.b)//a往b倒,a還沒清空
            {
                p2.a = p1.a - (b - p1.b);
                p2.b = b;
                p2.c = p1.c;
                p2.step = p1.step + 1;
            }
            else//a往b倒,a清空
            {
                p2.a = 0;
                p2.b = p1.b + p1.a;
                p2.c = p1.c;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])//用vist[][][]標記是否走過,走過標記爲1
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);//將這種情況入隊
            }
        }

        if (p1.a != 0)
        {
            if (p1.a > c - p1.c)
            {
                p2.a = p1.a - (c - p1.c);
                p2.b = p1.b;
                p2.c = c;
                p2.step = p1.step + 1;
            }
            else
            {
                p2.a = 0;
                p2.b = p1.b;
                p2.c = p1.c + p1.a;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);
            }
        }

        if (p1.b != 0)
        {
            if (p1.b>a - p1.a)
            {
                p2.b = p1.b - (a - p1.a);
                p2.a = a;
                p2.c = p1.c;
                p2.step = p1.step + 1;
            }
            else
            {
                p2.b = 0;
                p2.a = p1.a + p1.b;
                p2.c = p1.c;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);
            }
        }

        if (p1.b != 0)
        {
            if (p1.b>c - p1.c)
            {
                p2.b = p1.b - (c - p1.c);
                p2.a = p1.a;
                p2.c = c;
                p2.step = p1.step + 1;
            }
            else
            {
                p2.b = 0;
                p2.a = p1.a;
                p2.c = p1.c + p1.b;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);
            }
        }

        if (p1.c != 0)
        {
            if (p1.c>a - p1.a)
            {
                p2.c = p1.c - (a - p1.a);
                p2.a = a;
                p2.b = p1.b;
                p2.step = p1.step + 1;
            }
            else
            {
                p2.c = 0;
                p2.a = p1.a + p1.c;
                p2.b = p1.b;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);
            }
        }

        if (p1.c != 0)
        {
            if (p1.c>b - p1.b)
            {
                p2.c = p1.c - (b - p1.b);
                p2.a = p1.a;
                p2.b = b;
                p2.step = p1.step + 1;
            }
            else
            {
                p2.c = 0;
                p2.a = p1.a;
                p2.b = p1.b + p1.c;
                p2.step = p1.step + 1;
            }
            if (!vist[p2.a][p2.b][p2.c])
            {
                vist[p2.a][p2.b][p2.c] = 1;
                q.push(p2);
            }
        }
    }
    return -1;
}
發佈了47 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章