社区讨论
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 条回复,欢迎继续交流。
正在加载回复...