求条
查看原帖
求条
681941
OIer_Hhy楼主2024/8/9 11:10
#include<bits/stdc++.h>
using namespace std;
string st,ed;
queue<string> q[2];
map<string,int> mp[2];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int extend(int k){
	int dep=mp[k][q[k].front()];
	while(q[k].size()&&dep==mp[k][q[k].front()]){
		string now=q[k].front();q[k].pop();
		if(mp[k^1].count(now)) return mp[k][now]+mp[k^1][now];
		int x,y;
		for(int i=0;i<now.size();i++){
			if(now[i]=='0'){
				x=i/3;
				y=i%3;
				break;
			}
		}
		for(int i=0;i<4;i++){
			int nx=x+dx[i],ny=y+dy[i];
			if(nx<0||nx>2||ny<0||ny>2) continue;
			swap(now[nx*3+ny],now[x*3+y]);
			if(mp[k].count(now)){
				swap(now[nx*3+ny],now[x*3+y]);
				continue;
			}
			q[k].push(now);mp[k][now]=dep+1;
			swap(now[nx*3+ny],now[x*3+y]);
		}
	}
	return -1;
}
int bfs(){
	q[0].push(st);mp[0][st]=0;q[1].push(ed);mp[1][ed]=1;
	int t;
	while(q[0].size()&&q[1].size()){
		if(q[0].size()<=q[1].size()) t=extend(0);
		else t=extend(1);
		if(t!=-1) return t;
	}
}
int main(){
	cin>>st;
	cout<<bfs();
	return 0;
}

2024/8/9 11:10
加载中...