双向 bfs 代码求调
查看原帖
双向 bfs 代码求调
598875
nikodo楼主2024/1/18 17:28
#include<bits/stdc++.h>
using namespace std;
struct st{
	int z[9],pot;
}a,b;
bool vis[2][400000];
int dx[4]={-3,1,3,1};
int fact[10];
void init(){
	fact[1]=1;
	for(int i=2;i<=9;i++)fact[i]=fact[i-1]*i;
}
bool insertcode(st s){
	int code=0;
	for(int i=1;i<=9;i++){
		int cnt=0;
		for(int j=i+1;j<=9;j++)if(s.z[j]<s.z[i])cnt++;
		code+=fact[10-i]*cnt;
	}
	return code;
}
int doublebfs(){
	init();
	queue<st> q,q1;
	q.push(a);
	q1.push(b);
	int cnt=0;
	while(!q.empty()&&!q1.empty()){
		st now=q.front(),now1=q1.front();q.pop();q1.pop();
		int nowp=now.pot,nowp1=now1.pot;
		for(int i=0;i<4;i++){
			st tmp;
			tmp=now;
			tmp.pot=nowp+dx[i];
			swap(tmp.z[tmp.pot],tmp.z[nowp]);
			int tmpa=insertcode(tmp);
			if(vis[1][tmpa])return cnt+1;
			vis[0][tmpa]=1;
		}
		cnt++;
		for(int i=0;i<4;i++){
			st tmp;
			tmp=now1;
			tmp.pot=nowp1+dx[i];
			swap(tmp.z[tmp.pot],tmp.z[nowp]);
			int tmpa=insertcode(tmp);
			if(vis[0][tmpa])return cnt+1;
			vis[1][tmpa]=1;
		}
		cnt++;
	}
}
int main(){
	int n,m=123804765;
	cin>>n;
	for(int i=9;i>0;i--){
		a.z[i]=n%10;
		if(a.z[i]==0)a.pot=i;
		n/=10;
		b.z[i]=m%10;
		m/=10;
	}
	b.pot=5;
	cout<<doublebfs();
	return 0;
}
2024/1/18 17:28
加载中...