题意:题意开始有点不明啊,然后搜了下题意。。但只看了题意,没看别人怎么做。
题意很明了:从一个四位素数到另一个四位素数,每次变换一个数字,变换之后
仍为素数,最少的步骤。
思路:又是BFS的入门题呃。。。和之前做的有点类似,不过还得做啊,熟能生巧,
虽然算法思路差不多,但是当中的处理有点繁琐,也搞了不少时间,写得慢就证明
代码能力有待提高,做这题还是有意义的;一开始n是以数字的形式读入,然后处
理变换,发现有点麻烦啊。。所以换成了字符串读入,这就好处理多了。。
#include<cstring>
#include<queue>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
int dis[10000],prime[10000],vis[10000],m;
char str1[10],str2[10];
void primeTable()
{
int i,j;
memset(prime,0,sizeof(prime));
for(i=2;i<=10000;i++)
if(!prime[i])
for(j=i*2;j<=10000;j+=i)
prime[j]=1;
}
int bfs(int m)
{
int i,j,k;
queue<int> p;
p.push(atoi(str1));
while(!p.empty())
{
int num=p.front();
str1[0]='0'+num/1000,str1[1]='0'+num/100%10;
str1[2]='0'+num/10%10,str1[3]='0'+num%10;
str1[4]='\0';
p.pop();
if(num==m)
return dis[m];
for(k=0;k<4;k++)
{
for(j=str1[k]+1;j<='9';j++)
{
strcpy(str2,str1);
str2[k]=j;
int t=atoi(str2);
if(!vis[t]&&!prime[t])
{
vis[t]=1;
dis[t]=dis[num]+1;
p.push(t);
}
}
for(j=str1[k]-1;j>='0';j--)
{
strcpy(str2,str1);
str2[k]=j;
int t=atoi(str2);
if(t<1000)
break;
if(!vis[t]&&!prime[t])
{
vis[t]=1;
dis[t]=dis[num]+1;
p.push(t);
}
}
}
}
return -1;
}
int main()
{
int T,n,m;
scanf("%d",&T);
primeTable();
while(T--)
{
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
scanf("%s%d",str1,&m);
int res=bfs(m);
if(res==-1)
printf("Impossible\n");
else
printf("%d\n",res);
}
return 0;
}