BFS--巧妙取量

题目来源:codeup 链接

【题目描述】
  有三个容器,容量分别为 a,b,c(a> b > c ),一开始a装满油,现在问是否只靠abc三个容器量出k升油。如果能就输出“yes”,并且说明最少倒几次,否则输出“no”。例如:10升油在10升的容器中,另有两个7升和3升的空容器,要求用这三个容器倒油,使得最后在abc三个容器中有一个刚好存有5升油,问最少的倒油次数是多少?(每次倒油,A容器倒到B容器,或者A内的油倒完,或者B容器倒满。
 10 7 3
(10 0 0)
(3 7 0):第一次
(3 4 3):第二次
(6 4 0):第三次
(6 1 3):第四次
(9 1 0):第五次
(9 0 1):第六次
(2 7 1):第七次
(2 5 3):第八次,出现5了。

Input

【输入格式】
  有多组测试数据。
  输入a,b,c, k四个正整数( 100 ≥ a > b > c≥1 , 1≤k< 100 )

Output

【输出格式】
  如果能得到k就输出两行。
  第一行“yes”,第二行为最少的次数
  否则输出“no”

Sample Input
10 7 3 5


Sample Output
yes
8

一直WA。。欸。。之后再看看吧。先放着。

#include <iostream>
#include <queue>
using namespace std;
struct node
{
    int num[3];
    int step;
} start;
int a[3];
queue<node> Q;
bool has = false;
int m[101][101][101] = {0}; //用来判断某个状态是否已经存在了
int k;
void bfs()
{
    while (!Q.empty())
    {
        node top = Q.front();
        Q.pop();
        if (top.num[0] == k || top.num[1] == k || top.num[2] == k)
        {
            has = true;
            cout << "yes" << endl;
            cout << top.step << endl;
            return;
        }
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++) //从i往j里面倒水
            {
                int rest = a[j] - top.num[j]; //j里面剩余体积不为空,说明还可以往j里面倒水
                if (i != j && rest != 0)
                {
                    node temp = top;
                    if (top.num[i] > rest) //可以把j倒满
                    {
                        temp.num[i] -= rest;
                        temp.num[j] += rest;
                        temp.step = top.step + 1;
                    }
                    else //i会变成空
                    {
                        temp.num[i] = 0;
                        temp.num[j] += top.num[i];
                        temp.step = top.step + 1;
                    }
                    if (m[temp.num[0]][temp.num[1]][temp.num[2]] == 0)
                    {
                        Q.push(temp);
                        m[temp.num[0]][temp.num[1]][temp.num[2]] = 1;
                    }
                }
            }
        }
    }
}
int main()
{
    for (int i = 0; i < 3; i++)
    {
        cin >> a[i];
    }
    cin >> k;
    start.num[0] = a[0];
    start.num[1] = start.num[2] = 0;
    start.step = 0;
    m[a[0]][0][0] = 1;
    Q.push(start);
    bfs();
    if (!has)
    {
        cout << "no" << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39504764/article/details/89856929
BFS
今日推荐