84分 TLE on #7 双向bfs求优化
查看原帖
84分 TLE on #7 双向bfs求优化
1212465
SilVeR__WolF楼主2025/1/10 10:17
#include<bits/stdc++.h>
using namespace std;
int t,n,ans;
string sta,fin;// 开始状态和结束状态
unordered_map<string,int> mp;//每种状态所需的移动步数
struct node {
	int step;
	string s;
};
void bfs1(){
	queue<node> q;
	q.push({0,sta});//正着搜
	while(!q.empty()){
		node f=q.front(); q.pop();
		string s=f.s; int step=f.step;
		mp[s]=f.step;//记录当前状态的步数
		if(step==2)	continue;
		for(int i=0;i<n;i++){
			for(int j=i;j<n;j++){
				string sub=s.substr(i,j-i+1);//截取要移动的书本
				for(int k=0;k<=n-j+i-1;k++){
					string ls=s;
					ls.erase(i,j-i+1);
					ls.insert(k,sub);//移动书本
					if(mp.count(ls))	continue;//如果已经有过该状态就退出
					q.push({step+1,ls});
				}
			}
		}
	}
}
void bfs2(){
	queue<node> q;
	q.push({0,fin});//倒着搜
	while(!q.empty()){
		node f=q.front(); q.pop();
		string s=f.s; int step=f.step;
		if(mp.count(s)){
			ans=mp[s]+step;
			return ;
		}//汇合,更新答案并退出
		if(step==2)	continue;
		for(int i=0;i<n;i++){
			for(int j=i;j<n;j++){
				string sub=s.substr(i,j-i+1);
				for(int k=0;k<=n-j+i-1;k++){
					string ls=s;
					ls.erase(i,j-i+1);
					ls.insert(k,sub);
					q.push({step+1,ls});
				}
			}
		}
	}
}
int main(){
	cin>>t;
	while(t--){
		mp.clear();
		cin>>n;
		sta="";
		for(int i=0;i<n;i++){
			int k; cin>>k;
			sta+=char(k+'0');
		}
		fin="";
		for(int i=1;i<=n;i++)	fin+=char(i+'0');
		ans=2e9;
		bfs1();bfs2();
		if(ans==2e9)	cout<<"5 or more\n";//没有汇合就表示四次以内无法抵达,输出 5 or more
		else	cout<<ans<<"\n";
	}
	return 0;
}
2025/1/10 10:17
加载中...