rt.用 A* 样例 4 还没过,试着交了一发,本已准备好挂分,结果过了?求问为什么。
// A* Search Algorithm
// Luogu P5507
#include <set>
#include <queue>
#include <vector>
#include <cstdio>
#include <algorithm>
using ll = long long;
const int N = 12;
inline ll h(ll sta) { int res(0); for (int i = 0; i < N; i++) res += (4 - ((sta >> (i * 2)) & 3)) & 3; return res; }
struct node { ll sta, s; std::vector < int > vec; inline bool operator < (const node& a) const { return s + h(sta) > a.s + h(a.sta); } } u, v;
int a[N][4];
ll beg;
int get(ll sta, int idx) { return sta >> (idx * 2) & 3; }
ll change_bit(ll sta, int idx) { int tmp = get(sta, idx); sta ^= (ll)tmp << (idx * 2); (++tmp) &= 3; return sta | (ll)tmp << (idx * 2); }
ll change(ll sta, int idx) { int tmp = get(sta, idx); return change_bit(change_bit(sta, idx), a[idx][tmp]); }
int main()
{
int i, x;
ll ns;
for (i = 0; i < N; i++)
{
scanf("%d %d %d %d %d", &x, &a[i][0], &a[i][1], &a[i][2], &a[i][3]);
x--; a[i][0]--; a[i][1]--; a[i][2]--; a[i][3]--;
beg |= x << (i * 2);
}
std::priority_queue < node > Q;
std::set < ll > s;
Q.push({beg, 0, {}});
while (!Q.empty())
{
u = Q.top();
Q.pop();
if (!u.sta) { printf("%d\n", (int)u.vec.size()); for (i = 0; i < (int)u.vec.size(); i++) printf("%d ", u.vec[i]); return printf("\n"), 0; }
for (i = 0; i < N; i++)
{
ns = change(u.sta, i);
if (!s.count(ns))
{
v.vec = u.vec;
v.vec.emplace_back(i + 1);
v.s = u.s + 1;
v.sta = ns;
Q.push(v);
s.insert(ns);
}
}
}
return 0;
}