Pots(DFS &BFS)

//新生训练

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 205;
int n, m;
int l;
int A, B, C;
int dis[N][N];

struct node
{
    int px, py, op;
};

node pre[N][N];

void dfs(int x, int y)
{
    if (x == 0 && y == 0)
    {
        return;
    }
    dfs(pre[x][y].px, pre[x][y].py);
    switch (pre[x][y].op)
    {
    case 1:
        cout << "FILL(1)\n";
        break;
    case 2:
        cout << "FILL(2)\n";
        break;
    case 3:
        cout << "DROP(1)\n";
        break;
    case 4:
        cout << "DROP(2)\n";
        break;
    case 5:
        cout << "POUR(1,2)\n";
        break;
    case 6:
        cout << "POUR(2,1)\n";
    }
}

bool flag = 1;

void bfs()
{
    queue<PII> q;
    q.push(make_pair(0, 0));
    dis[0][0] = 0;
    while (!q.empty())
    {
        PII t = q.front();
        q.pop();

        int x = t.first, y = t.second;
        if (x == C || y == C)
        {
            cout << dis[x][y] << '\n';
            dfs(x, y);
            flag = 0;
            return;
        }
        int ix, iy;

        // FILL(1)
        ix = A, iy = y;
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 1};
            q.push(make_pair(ix, iy));
        }

        // FILL(2)
        ix = x, iy = B;
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 2};
            q.push(make_pair(ix, iy));
        }

        // DROP(1)
        ix = 0, iy = y;
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 3};
            q.push(make_pair(ix, iy));
        }

        // DROP(2)
        ix = x, iy = 0;
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 4};
            q.push(make_pair(ix, iy));
        }

        // POUR(1,2)
        ix = x, iy = y;
        while (ix && iy < B)
        {
            --ix;
            ++iy;
        }
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 5};
            q.push(make_pair(ix, iy));
        }

        // POUR(2,1)
        ix = x, iy = y;
        while (iy && ix < A)
        {
            ++ix;
            --iy;
        }
        if (dis[ix][iy] == -1)
        {
            dis[ix][iy] = dis[x][y] + 1;
            pre[ix][iy] = {x, y, 6};
            q.push(make_pair(ix, iy));
        }
    }
}

void solve()
{
    memset(dis, -1, sizeof dis);
    cin >> A >> B >> C;
    bfs();
    if (flag)
        cout << "impossible";
}

signed main()
{
    int t = 1;
    // cin>>t;
    while (t--)
    {
        solve();
    }
    return 0;
}

//感谢学长的讲解 hwh ;

~~~//仅当笔者个人备忘录使用。

相关推荐
Larry_Yanan2 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
寂静山林2 小时前
UVa 10228 A Star not a Tree?
算法
Neverfadeaway2 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
R-G-B2 小时前
【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
c++·mfc·mfc运行 不显界面·mfc界面不显示
Madison-No73 小时前
【C++】探秘vector的底层实现
java·c++·算法
晚风残3 小时前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
Swift社区3 小时前
LeetCode 401 - 二进制手表
算法·leetcode·ssh
派大星爱吃猫3 小时前
顺序表算法题(LeetCode)
算法·leetcode·职场和发展
liu****3 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
保持低旋律节奏4 小时前
C++ stack、queue栈和队列的使用——附加算法题
c++