求优化 qwq
  • 板块P5507 机关
  • 楼主lsj2009Isj2OO9
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/3/29 20:47
  • 上次更新2023/10/28 05:13:23
查看原帖
求优化 qwq
468657
lsj2009Isj2OO9楼主2022/3/29 20:47

代码似乎是正确的(?)如果搜索过程答案超出 1717assert(0),但该代码却并没有 RE,答案是速度却慢到了姥姥家,应该是常数问题,但不至于这样吧?求助大佬 qwq

Code

#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;
}
2022/3/29 20:47
加载中...