罐子(bfs)

原题链接

解题思路:本题可以把两个罐子中的水量看成二维坐标中的点,然后套一下bfs的板子就行了
C++代码
#include <bits/stdc++.h>
// #define int long long 
using namespace std;
const int N = 110;
int dist[N][N]; //判重
struct Node //记录坐标及该坐标怎么拓展过来的
{
    int x, y;
    string s;
};
string op[6]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"}; //定义6种操作
int a, b, c;

int bfs()
{
    memset(dist, 0x3f, sizeof dist);
    queue<Node> q;
    q.push({0, 0, ""});
    dist[0][0] = 0;
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        int xx = t.x, yy = t.y;
        if (xx == c || yy == c)
        {
            cout << dist[xx][yy] << endl;
            for (int i = 0; i < t.s.size(); i ++ )
            {
                cout << op[t.s[i]] << endl;
            }
            return 0;
        }
        //下面四行代码定义了坐标点拓展的偏移量
        int t1 = min(xx, b - yy);
        int t2 = min(a - xx, yy);
        int dx[6] = {a - xx, 0, -xx, 0, -t1, t2};
        int dy[6] = {0, b - yy, 0, - yy, t1, -t2};
        for (int i = 0; i < 6; i ++ )
        {
            int a = xx + dx[i], b = yy + dy[i];
            if (dist[a][b] == 0x3f3f3f3f)
            {
                dist[a][b] = dist[xx][yy] + 1;
                q.push({a, b, t.s + (char)i});
            }
        }
    }
    cout<<"impossible"<<endl;
    return 0;
}

signed main()
{
    cin >> a >> b >> c;
    bfs();
    return 0;
}

创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值