求调
查看原帖
求调
466596
MorningStarCzy楼主2024/5/19 13:20
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
int T,n,m,p[10005],vis[10005],ans=2e9;
struct number{
	int num,step;
}st;
queue<number>Q;
bool prime(int x)
{
	for(int i=1;i<=n*n;i++)
		if(x%i==0) return 0;
	return 1;
}
void init()
{
	while(!Q.empty()) Q.pop();
}
int bfs()
{
	Q.push(st);
	while(!Q.empty())
	{
		number now=Q.front();
		if(now.num==m)
		{
			ans=min(ans,now.step);
			return 1;
		}
		Q.pop();
		int a=now.num/1000;
		int b=now.num/100%10;
		int c=now.num/10%10;
		int d=now.num%10;
		for(int i=1;i<10;i++)
		{
			number s;
			s.num=1000*i+100*b+10*c+d;
			s.step=now.step+1;
			if(p[s.num]==1&&!vis[s.num]) Q.push(s);
		}
		for(int i=0;i<10;i++)
		{
			number s;
			s.num=1000*a+100*i+10*c+d;
			s.step=now.step+1;
			if(p[s.num]==1&&!vis[s.num]) Q.push(s);
		}
		for(int i=0;i<10;i++)
		{
			number s;
			s.num=1000*a+100*b+10*i+d;
			s.step=now.step+1;
			if(p[s.num]==1&&!vis[s.num]) Q.push(s);
		}
		for(int i=0;i<10;i++)
		{
			number s;
			s.num=1000*a+100*b+10*c+i;
			s.step=now.step+1;
			if(p[s.num]==1&&!vis[s.num]) Q.push(s);
		}
	}
	return 0;
}
int main()
{
	for(int i=1000;i<=9999;i++) p[i]=prime(i);
	cin>>T;
	while(T--)
	{
		init();
		cin>>n>>m;
		if(n==m)
		{
			cout<<0;
			continue;
		}
		st.num=n,st.step=0;
		if(!bfs()) cout<<"Impossible"<<endl;
		else cout<<ans<<endl;
	}
	return 0;
}
2024/5/19 13:20
加载中...