这,就是玄学?
  • 板块P5507 机关
  • 楼主SJZ2010
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/21 17:45
  • 上次更新2024/1/21 19:36:03
查看原帖
这,就是玄学?
809729
SJZ2010楼主2024/1/21 17:45

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;
}
2024/1/21 17:45
加载中...