10分求助,玄inf关
查看原帖
10分求助,玄inf关
1370556
__lcm楼主2024/8/9 15:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
int mp[4][4],dx[5]={0,0,-1,1},dy[5]={1,-1,0,0};
map<int,bool>vis;//太大
void solve(int x){
	int w[15],cnt=0;
	memset(w,0,sizeof(w));
	while(x){
		w[++cnt]=x%10;
		x/=10;
	}
	reverse(w+1,w+9+1);
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
			mp[i][j]=w[3*(i-1)+j];
 	//数字转换成数组
}
int f(){
	int ans=0;
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
			ans=ans*10+mp[i][j];
	return ans;
  //数组转换成数字
}
struct node{
	int now,time;
};
signed main(){
	int x,cnt=0;
	cin>>x;
	queue<node>q;
	q.push(node{x,0});
	vis[x]=1;
	while(q.size()){
		node now=q.front();
		q.pop();
		if(now.now==123804765){
			cout<<now.time;
			return 0;
		}
		solve(now.now);
		int x0,y0;
		for(int i=1;i<=3;i++)
			for(int j=1;j<=3;j++)
				if(mp[i][j]==0)
					x0=i,y0=j;
		for(int i=0;i<4;i++){
			int xx=x0+dx[i],yy=y0+dy[i];
			if(xx<1||yy>1||xx>3||yy>3) continue;
			swap(mp[x0][y0],mp[xx][yy]);
			int ans=f();
			if(vis[ans]==0){
				q.push(node{ans,now.time+1});
				vis[ans]=1;
			}
			swap(mp[x0][y0],mp[xx][yy]);
		}
	}
}```
2024/8/9 15:16
加载中...