双向宽搜求调
  • 板块P5507 机关
  • 楼主zhaowangji
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/16 23:37
  • 上次更新2023/11/4 00:21:40
查看原帖
双向宽搜求调
164840
zhaowangji楼主2021/11/16 23:37

样例不过……后面放上40分的单向宽搜代码(双向很多都是套用于此)

#include<bits/stdc++.h>
using namespace std;
const int n=12;
int stt,det;
const int MAXN=(1<<24)+7;
map<int,vector<int> >jud,rjud;
int cha[20][10];
int Read();
void bfs();
void change(int &x,int b);
int make_new_status(int x,int b);
int rmake_new_status(int x,int b);
int main(){
	for(int i=1;i<=n;++i){
		int x=Read();stt+=(x-1)<<((i-1)<<1);
		for(int j=1;j<=4;++j)
			cha[i][j]=Read();
	}
	bfs();
	return 0;
}
void change(int &x,int b){
	int num=(x>>((b-1)<<1))&3;
	x-=num*(1<<((b-1)<<1));
	++num;
	if(num!=4)x+=num*(1<<((b-1)<<1));
}
int make_new_status(int x,int b){
	change(x,cha[b][((x>>((b-1)<<1))&3)+1]);
	change(x,b);
	return x;
}
int rmake_new_status(int x,int b){
	for(int i=1;i<=3;++i)change(x,cha[b][((x>>((b-1)<<1))&3)+1]);
	for(int i=1;i<=3;++i)change(x,b);
	return x;
}
void bfs(){
	det=0;
	queue<pair<vector<int>,int> > q;vector<int> _;
	queue<pair<vector<int>,int> > rq;vector<int> r_;
	q.push(make_pair(_,stt));
	rq.push(make_pair(r_,det));
	jud[stt]=_,rjud[det]=r_;
	while(q.size()||rq.size()){
		if(q.size()){
			vector<int> x=q.front().first;int y=q.front().second;q.pop();
			if(jud[y].size()&&rjud[y].size()){
				printf("%lld\n",jud[y].size()+rjud[y].size());
				for(int i=0;i<jud[y].size();++i)printf("%d ",jud[y][i]);
				for(int i=rjud[y].size()-1;i>=0;--i)printf("%d ",rjud[y][i]);
				printf("\n");
				return;
			}
			for(int i=1;i<=n;++i){
				vector<int>_atp=x;int atp=make_new_status(y,i);
				if(jud[atp].size()==0){
					jud[atp]=_atp;
					_atp.push_back(i);
					q.push(make_pair(_atp,atp));
				}
			}
		}
		if(rq.size()){
			vector<int> rx=rq.front().first;int ry=rq.front().second;rq.pop();
			if(jud[ry].size()&&rjud[ry].size()){
				printf("%lld\n",jud[ry].size()+rjud[ry].size());
				for(int i=0;i<jud[ry].size();++i)printf("%d ",jud[ry][i]);
				for(int i=rjud[ry].size()-1;i>=0;--i)printf("%d ",rjud[ry][i]);
				printf("\n");
				return;
			}
			for(int i=1;i<=n;++i){
				vector<int>r_atp=rx;int ratp=rmake_new_status(ry,i);
				if(rjud[ratp].size()==0){
					rjud[ratp]=r_atp;
					r_atp.push_back(i);
					rq.push(make_pair(r_atp,ratp));
				}
			}
		}
	}
}
int Read(){
	char ch=getchar();
	int f_r=1,res=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f_r=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=res+res*4;
		res+=res+ch-'0';
		ch=getchar();
	}
	return f_r*res;
}
#include<bits/stdc++.h>
using namespace std;
const int n=12;
int stt,det;
const int MAXN=(1<<24)+7;
int jud[MAXN];
int cha[20][10];
int Read();
void bfs();
void change(int &x,int b);
int make_new_status(int x,int b);
int main(){
	for(int i=1;i<=n;++i){
		int x=Read();stt+=(x-1)<<((i-1)<<1);
		for(int j=1;j<=4;++j)
			cha[i][j]=Read();
	}
	bfs();
	return 0;
}
void change(int &x,int b){
	int num=(x>>((b-1)<<1))&3;
	x-=num*(1<<((b-1)<<1));
	++num;
	if(num!=4)x+=num*(1<<((b-1)<<1));
}
int make_new_status(int x,int b){
	change(x,cha[b][((x>>((b-1)<<1))&3)+1]);
	change(x,b);
	return x;
}
void bfs(){
	jud[stt]=1;
	queue<pair<vector<int>,int> > q;vector<int> _;
	q.push(make_pair(_,stt));
	while(!q.empty()){
		vector<int> x=q.front().first;int y=q.front().second;q.pop();
		if(y==0){
			printf("%d\n",x.size());
			int x_size=x.size();
			for(int i=0;i<x_size;++i)printf("%d ",x[i]);
			printf("\n");
			exit(0);
			}
		for(int i=1;i<=n;++i){
			vector<int>_atp=x;int atp=make_new_status(y,i);
			if(jud[atp])continue;
			_atp.push_back(i),jud[atp]=1;
			q.push(make_pair(_atp,atp));
		}
	}
}
int Read(){
	char ch=getchar();
	int f_r=1,res=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f_r=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=res+res*4;
		res+=res+ch-'0';
		ch=getchar();
	}
	return f_r*res;
}
2021/11/16 23:37
加载中...