其他分享
首页 > 其他分享> > poj3414 Pots

poj3414 Pots

作者:互联网

搜索空间不过 \(1e4\) ,暴力 \(bfs\) 即可得到最少操作。

输出每次操作可能需要手动模拟栈,方便找到最优解后回溯输出。

/**
* poj3414 Pots
*
*/

#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

const int N = 1e4+5;
bool book[101][101];
struct node{int a, b, step, op, fa;} Q[N];
int bfs(int A, int B, int C)
{
    memset(book, 0, sizeof book);
    int head = 0;
    int tail = 0;
    Q[tail++] = node{0, 0, 0, 0, -1};
    book[0][0] = 1;
    while (head != tail) {
        //    cout << head << '#';
        node t = Q[head];
        if (t.a == C || t.b == C) {
            return head;
        }

        if (!book[A][t.b]) {  // FILL(1)
            Q[tail++] = node{A, t.b, t.step+1, 11, head};
            book[A][t.b] = 1;
        }
        if (!book[t.a][B]) {  // FILL(2)
            Q[tail++] = node{t.a, B, t.step+1, 12, head};
            book[t.a][B] = 1;
        }
        if (!book[0][t.b]) {  // DROP(1)
            Q[tail++] = node{0, t.b, t.step+1, 21, head};
            book[0][t.b] = 1;
        }
        if (!book[t.a][0]) {  // DROP(2)
            Q[tail++] = node{t.a, 0, t.step+1, 22, head};
            book[t.a][0] = 1;
        }

        // DROP(1,2)
        int a = max(0, t.a-B+t.b);
        int b = min(B, t.a+t.b);
        if (!book[a][b]) {
            Q[tail++] = node{a, b, t.step+1, 31, head};
            book[a][b] = 1;
        }

        // DROP(2,1)
        a = min(A, t.a+t.b);
        b = max(0, t.b-A+t.a);
        if (!book[a][b]) {
            Q[tail++] = node{a, b, t.step+1, 32, head};
            book[a][b] = 1;
        }
        ++head;
    }
    return -1;
}

char out[][20] = {
    "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)"
};

int parse(int op)
{
    switch(op)
    {
        case 11: return 0; break;
        case 12: return 1; break;
        case 21: return 2; break;
        case 22: return 3; break;
        case 31: return 4; break;
        case 32: return 5; break;
    }
    return -1;
}

int main()
{
    int A, B, C;
    while (cin >> A >> B >> C) {
        int pos = bfs(A, B, C);
        if (pos == -1) {
            puts("impossible");
            continue;
        }
        stack<int> st;
        while (pos != 0) {
            st.push(Q[pos].op);
            pos = Q[pos].fa;
        }
        cout << st.size() << endl;
        while (!st.empty()) {
            // cout << st.top() << endl;
            int t = st.top();
            cout << out[parse(t)] << endl;
            st.pop();
        }
    }

    return 0;
}

标签:int,poj3414,Pots,pos,bfs,tail,book,include
来源: https://www.cnblogs.com/zbhfz/p/14316503.html