求助A*MLE
查看原帖
求助A*MLE
344405
曹操废了楼主2022/4/10 12:25

RT,有人有什么优化思路吗

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
//#define int long long
#define MAXN 1001
using namespace std;
string s;
int a[10][10],b[10][10]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}};//值为i,目标图
int dir[10][10]={{0},{-1,0},{1,0},{0,-1},{0,1}};
struct kx{
	int f[10][10],cnt,x,y,ans;//图,已经移动的距离,0的位置,不在位置上的个数
	bool operator > (const kx & tmp)const{
		return cnt+ans>tmp.ans+tmp.cnt;
	} 
};
kx st;
signed main(){
	ios::sync_with_stdio(false); 
	cin>>s;
	int sx,sy;
	for(int i=0;i<s.size();i++){
		a[i/3+1][i%3+1]=s[i]-'0';
		if(s[i]-'0'==0){
			sx=i/3+1;
			sy=i%3+1;
		}
	}
	st.x=sx;
	st.y=sy;

	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			st.f[i][j]=a[i][j];
		}
	}

	st.cnt=0;

	int ans2=0;
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			if(a[i][j]!=b[i][j]) ans2++;
		}
	}
	st.ans=ans2;

	priority_queue<kx,vector<kx>,greater<kx> > q;
	q.push(st);

	while(!q.empty()){
		kx h=q.top();
		q.pop();
		if(h.ans==0){
			cout<<h.cnt;
			break;
		}
		for(int i=1;i<=4;i++){
			int dx=h.x+dir[i][0],dy=h.y+dir[i][1];
			if(dx>=1&&dx<=3&&dy>=1&&dy<=3){
				kx e=h;
				e.cnt++;
				if(e.f[dx][dy]==b[dx][dy]){
					e.ans++;
				}
				if(e.f[e.x][e.y]==b[e.x][e.y]){
					e.ans++;
				}
				if(b[dx][dy]==0){
					e.ans--;
				}
				if(b[e.x][e.y]==e.f[dx][dy]){
					e.ans--;
				}
				swap(e.f[dx][dy],e.f[e.x][e.y]);
				e.x=dx,e.y=dy;
				q.push(e);
			}
		}
	}
	return 0;
}
2022/4/10 12:25
加载中...