A*算法为什么第10个点TLE呀?
  • 板块P5507 机关
  • 楼主abao00200
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/28 19:38
  • 上次更新2025/7/29 07:43:46
查看原帖
A*算法为什么第10个点TLE呀?
1380031
abao00200楼主2025/7/28 19:38
#include <bits/stdc++.h>
using namespace std;
int g[(1<<24)+5];
int pre[(1<<24)+5][2];
int a[13][5];
int ys(int *x)//把数组x的1-12位状压为一个数 
{
	int ans=0;
	for(int i=1;i<=12;i++)
	{
		ans=(ans<<2)|x[i];
	}
	return ans;
}
void jy(int y,int *x)//把y这个数解压到x数组 
{
	for(int i=12;i>=1;i--)
	{
		x[i]=y&3;
		y>>=2;
	}
}
int ins(int i,int *x)//对x数组的每一位进行第i种扭转,然后压缩,返回压缩值 
{
	x[a[i][x[i]+1]]++;
	x[a[i][x[i]+1]]%=4;
	x[i]++;
	x[i]%=4;
	return ys(x);
}
void sc(int x)
{
	if(pre[x][0]==-1) return;
	sc(pre[x][0]);
	cout<<pre[x][1]<<" ";
}
struct node{
	int x;
	double f;
	node(int nx)
	{
		x=nx;
		double h=0;
		int o[13];
		jy(x,o);
		for(int i=1;i<=12;i++) h+=min(4-o[i],o[i]-0);
		h/=2;
		f=g[x]+h;
	}
};
bool operator < (node x,node y)
{
	return x.f>y.f;
}
priority_queue <node> q;
int main()
{
	memset(g,-1,sizeof(g));
	memset(pre,-1,sizeof(pre));
	int x[13];
	for(int i=1;i<=12;i++)
	{
		cin>>x[i];
		x[i]--;
		for(int j=1;j<=4;j++) cin>>a[i][j];
	}
	int b=ys(x);
	for(int i=1;i<=12;i++) x[i]=0;
	int e=ys(x);
	if(b==e)
	{
		cout<<0;
		return 0;
	}
	g[b]=0;
	q.push(node(b));
	int k;
	while(!q.empty())
	{
		node p=q.top();
		q.pop();
		int y[13];
		jy(p.x,y);
		for(int i=1;i<=12;i++)
		{
			int z[13];
			memcpy(z,y,sizeof(y));
			k=ins(i,z);
			if(g[k]==-1)
			{
				g[k]=g[p.x]+1;
				pre[k][0]=p.x;
				pre[k][1]=i;
				if(k==e)
				{
					cout<<g[k]<<endl;
					sc(k);
					return 0;
				}
				q.push(node(k));
			}
		}
	}
	return 0;
}

测试链接

2025/7/28 19:38
加载中...