bfs水题吧,这题没什么好说的,比较有价值的地方有两点。 ①:有关memset的问题 ② 把一个四位数,千、百、十、个位分离的方法
#include <cstdio>
#include <cstring>#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int que[MAXN];
int prime[MAXN];
int vis[MAXN];
int a,b;
int step[MAXN];
void isprime()
{
f or(int i=2;i<=MAXN;i++) prime[i]=1; //memset不能赋1,只能0和-1
prime[0]=prime[1]=0;
for(int i=2;i<=MAXN;i++)
{
if(prime[i]==1)
{
for(int j=i+i;j<=MAXN;j+=i)
{
prime[j]=0;
}
}
}
}
void bfs()
{
int ft=0,ed=0;
que[ed++]=a;
vis[a]=1;
step[a]=0;
while(ft<ed)
{
int x=que[ft++];
vis[x]=1;
for(int i=1;i<=9;i+=2)
{
int nx=x/10*10+i;
if(vis[nx]==0 && prime[nx]==1)
{
vis[nx]=1;
que[ed++]=nx;
step[nx]=step[x]+1;
if(nx==b)
{
printf("%d\n",step[nx]);
return ;
}
}
}
for(int i=0;i<=9;i++)
{
int nx=x/100*100+x%10+i*10;
if(vis[nx]==0 && prime[nx]==1)
{
vis[nx]=1;
que[ed++]=nx;
step[nx]=step[x]+1;
if(nx==b)
{
printf("%d\n",step[nx]);
return ;
}
}
}
for(int i=0;i<=9;i++)
{
int nx=x/1000*1000+x%100+i*100;
if(vis[nx]==0 && prime[nx]==1)
{
vis[nx]=1;
que[ed++]=nx;
step[nx]=step[x]+1;
if(nx==b)
{
printf("%d\n",step[nx]);
return ;
}
}
}
for(int i=1;i<=9;i++)
{
int nx=x%1000+i*1000;
if(vis[nx]==0 && prime[nx]==1)
{
vis[nx]=1;
que[ed++]=nx;
step[nx]=step[x]+1;
if(nx==b)
{
printf("%d\n",step[nx]);
return ;
}
}
}
}
}
int main()
{
isprime();
int t;
cin >> t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
cin >> a >> b;
if(a==b)
{
printf("0\n");
continue;
}
bfs();
if(step[b]==0)
printf("Impossible\n");
}
}