社区讨论

90pts,求助!

P2324[SCOI2005] 骑士精神参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m64o1uiq
此快照首次捕获于
2025/01/20 14:29
去年
此快照最后确认于
2025/11/04 11:13
4 个月前
查看原帖
CPP
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
#define max(l, r) ((l) < (r) ? (r) : (l))
#define min(l, r) ((l) > (r) ? (r) : (l))
#define unsm(l, r,r1,r2,r3,r4) (l != r && l != r1 && l != r2 && l != r3 && l != r4)
#define sm(l, r) l == r
struct strings { string s; short stp = 0, p = 0; };
short op[8][2]{ {0,-11},{0,-9},{0,-3},{0,7},{0,11},{0,9},{0,3},{0,-7} }, cnt = 5;
static void solve() {
    string n, a;
    while (cnt--) cin >> a, n += a;
    if (n == "111110111100*110000100000") {
        cout << "0\n";
        return;
    }
    bool flag = false, flag1 = false, flag2 = false, flag3 = false;
    unordered_map<string, int>mp, mp1;
    queue<strings>q, q1;
    strings X, Y;
    char ch = 0;
    X.s = n, Y.s = "111110111100*110000100000";
    X.p = n.find('*'), Y.p = 12;
    q.push(X), q1.push(Y);
    mp[n] = 0, mp1["111110111100*110000100000"] = 0;
    while (!q.empty() && !q1.empty()) {
        strings tmp = q.front(), move;
        q.pop();
        if (tmp.stp < 10) {
            flag = unsm(tmp.p, 4, 9, 14, 19, 24);
            flag1 = unsm(tmp.p, 0, 5, 10, 15, 20);
            flag2 = unsm(tmp.p, 3, 8, 13, 18, 23);
            flag3 = unsm(tmp.p, 1, 6, 11, 16, 21);
            op[0][0] = tmp.p >= 11 && flag1;
            op[1][0] = tmp.p >= 10 && flag;
            op[2][0] = tmp.p >= 5 && flag && flag2;
            op[3][0] = tmp.p <= 17 && flag && flag2;
            op[4][0] = tmp.p <= 13 && flag;
            op[5][0] = tmp.p <= 13 && flag1;
            op[6][0] = tmp.p <= 19 && flag1 && flag3;
            op[7][0] = tmp.p >= 8 && flag1 && flag3;
            for (int i = 0; i < 8; i++) {
                if (op[i][0]) {
                    move = tmp;
                    move.stp = tmp.stp + 1;
                    cnt = move.p + op[i][1];
                    swap(move.s[cnt], move.s[move.p]);
                    if (mp1.count(move.s)) {
                        cnt = move.stp + mp1[move.s];
                        cout << (cnt > 15 ? -1 : cnt) << '\n';
                        return;
                    }
                    if (!mp.count(move.s)) {
                        move.p = cnt;
                        q.push(move);
                        mp[move.s] = move.stp;
                    }
                }
            }
        }
        tmp = q1.front();
        q1.pop();
        if (tmp.stp < 10) {
            flag = unsm(tmp.p, 4, 9, 14, 19, 24);
            flag1 = unsm(tmp.p, 0, 5, 10, 15, 20);
            flag2 = unsm(tmp.p, 3, 8, 13, 18, 23);
            flag3 = unsm(tmp.p, 1, 6, 11, 16, 21);
            op[0][0] = tmp.p >= 11 && flag1;
            op[1][0] = tmp.p >= 10 && flag;
            op[2][0] = tmp.p >= 5 && flag && flag2;
            op[3][0] = tmp.p <= 17 && flag && flag2;
            op[4][0] = tmp.p <= 13 && flag;
            op[5][0] = tmp.p <= 13 && flag1;
            op[6][0] = tmp.p <= 19 && flag1 && flag3;
            op[7][0] = tmp.p >= 8 && flag1 && flag3;
            for (int i = 0; i < 8; i++) {
                if (op[i][0]) {
                    move = tmp;
                    move.stp = tmp.stp + 1;
                    cnt = move.p + op[i][1];
                    swap(move.s[cnt], move.s[move.p]);
                    if (mp.count(move.s)) {
                        cnt = move.stp + mp[move.s];
                        cout << (cnt > 15 ? -1 : cnt) << '\n';
                        return;
                    }
                    if (!mp1.count(move.s)) {
                        move.p = cnt;
                        q1.push(move);
                        mp1[move.s] = move.stp;
                    }
                }
            }
        }
    }
    cout << "-1\n";
    return;
}
int main() {
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) cnt = 5, solve();
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...