代码似乎是正确的(?)如果搜索过程答案超出 17 会 assert(0),但该代码却并没有 RE,答案是速度却慢到了姥姥家,应该是常数问题,但不至于这样吧?求助大佬 qwq
#include<bits/stdc++.h>
#define pd push_back
#define pb pop_back
#define mk make_pair
//#define int long long
#define PII pair<int,int>
#define _for(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
template <typename T> inline void read(T& x) {
x=0; T f=1;
char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch&15); ch=getchar(); }
x=x*f;
return;
}
template <typename T,typename ...Arg> inline void read(T& x,Arg& ...arg){
read(x); read(arg...);
}
int power(int a,int b) {
int ans=1;
do {
if(b&1) ans*=a; a*=a;
} while(b>>=1);
return ans;
}
const int N=20,n=12,S=1<<24;
int a[N][5],dis[S],fa[S],c[S],s,x;
struct node {
int state,tot;
node(int x) {
state=x;
_for(i,0,n-1)
if((state>>(i<<1))&3)
tot+=4-((state>>(i<<1))&3);
tot+=dis[state];
}
bool operator < (const node& t) const {
return tot>t.tot;
}
};
void A_star() {
priority_queue<node> Heap;
Heap.push(node(s));
while(!Heap.empty()) {
int t=Heap.top().state; Heap.pop();
if(dis[t]>17) assert(0);
if(t==0) break;
_for(i,0,n-1) {
int i_val=(t>>(i<<1))&3;
int s_a_i=a[i][i_val];
int a_i_val=(t>>(a[i][i_val]<<1))&3;
int nxt_state;
nxt_state=t^(i_val<<(i<<1))^(((i_val+1)&3)<<(i<<1));
nxt_state=nxt_state^(a_i_val<<(s_a_i<<1))^(((a_i_val+1)&3)<<(s_a_i<<1));
if(!dis[nxt_state]) {
dis[nxt_state]=dis[t]+1;
fa[nxt_state]=t;
c[nxt_state]=i+1;
Heap.push(node(nxt_state));
}
}
}
stack<int> ans;
int x=0;
while(x!=s)
ans.push(c[x]),x=fa[x];
printf("%d\n",ans.size());
while(!ans.empty())
printf("%d ",ans.top()),ans.pop();
}
signed main() {
_for(i,0,n-1) {
read(x); s|=(x-1)<<(i<<1);
_for(j,0,3)
read(a[i][j]),--a[i][j];
}
A_star();
return 0;
}