先对素数进行打表处理,以后可能也会用到
对bfs思想的一个理解
/*
题意:一个四位数 ,从一个素数变成另一个素数,每次只能改变其中一位数,并且每次新形成的数字必须是素数,需要几步达到目标素数
*/
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000
using namespace std;
int dis[N];
int cnt[N];
int queue[N];
bool prime[N];
void init() //对素数打表
{
int i,j;
for(i=1000; i<=N; i++)
{
for(j=2; j<i; j++)
if(i%j==0)
{
prime[i]=false;
break;
}
if(j==i) prime[i]=true;
}
}
int bfs(int begin,int end)
{
int t[4];
int front=0,back=0;
dis[begin]=1;
cnt[begin]=0;
queue[back++]=begin;
int ttmp,mm;
while(front<back)
{
int tmp=queue[front++];
t[0]=tmp/1000;
t[1]=tmp/100%10;
t[2]=tmp%100/10;
t[3]=tmp%10;
for(int i=0;i<4;i++)
{
int tt=t[i]; //暂时保存这位数字,之后还原
for(int j=0;j<10;j++)
{
if(j!=t[i])
{
t[i]=j;
ttmp=t[0]*1000+t[1]*100+t[2]*10+t[3];
if(!dis[ttmp]&&prime[ttmp])
{
dis[ttmp]=1;
cnt[ttmp]=cnt[tmp]+1;
queue[back++]=ttmp; //这里一定要注意,新产生的数要放到队列当中
}
if(ttmp==end) return cnt[ttmp];
}
}
t[i]=tt;
}
if(tmp==end) return cnt[tmp];
}
return -1;
}
int main()
{
int t;
int begin,end;
init();
scanf("%d",&t);
while(t--)
{
memset(dis,0,sizeof(dis));
scanf("%d%d",&begin,&end);
int ans=bfs(begin,end);
if(ans!=-1)
printf("%d\n",ans);
else printf("Impossible\n");
}
}