方老师最近很喜欢素数,他想玩一个游戏:
现在有两个 4 位的素数 n 和 m ,你一次可以改变 n 的一位数字,并且改变过后的新数字必须也是个素数,并且也不能有前导 0 。请问使 n 变为 m 最少需要多少步。
例如 n=1033 m=8179
那么可行的变化是:
1033 1733 3733 3739 3779 8779 8179
Input
第一行有一个整数 T(T≤100) ,代表测试数据的组数。
对于每组数据,每行有两个 4 位素数 N,M (没有前导 0 )
Output
对于每一组数据,如果能够得到
m
,输出最少的步数,否则输出Impossible
Sample input and output
Sample Input | Sample Output |
---|---|
3 1033 8179 1373 8017 1033 1033 | 6 7 0 |
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int N,M;
bool vis[10001];
bool prime[10001];
int bfs()
{
queue<int>q;
q.push(N);
q.push(-1);
int t;
int ans=0;
while (!q.empty())
{
t=q.front();
q.pop();
if(t==-1) //表示完成一次改变还没有达到目标
{
ans++;
if(q.empty())
{
return -1;
}
q.push(t);
continue;
}
if(t==M)
{
return ans;
}
int temp;
for (int i=1; i<=9; i++) //千位
{
temp=t%1000+i*1000;
if(!vis[temp] && prime[temp])
{
vis[temp]=true;
q.push(temp);
}
}
for (int i=0; i<=9; i++) //百位
{
temp=t/1000*1000+t%100+i*100;
if(!vis[temp] && prime[temp])
{
vis[temp]=true;
q.push(temp);
}
}
for (int i=0; i<=9; i++) //十位
{
temp=t/100*100+t%10+i*10;
if(!vis[temp] && prime[temp])
{
vis[temp]=true;
q.push(temp);
}
}
for (int i=0; i<=9; i++) //个位
{
temp=t/10*10+i;
if(!vis[temp] && prime[temp])
{
vis[temp]=true;
q.push(temp);
}
}
}
return -1;
}
int main()
{
int t;
prime[2]=true;
prime[1]=false;
for (int i=3; i<10000; i++)
{
if(i%2==0)
{
prime[i]=false;
}
else
{
prime[i]=true;
}
}
for (int i=3; i*i<10000; i++)
{
if(prime[i])
{
for (int j=2; j*i<10000; j++)
{
prime[j*i]=false;
}
}
}
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&N,&M);
memset(vis, false, sizeof(vis));
int x=bfs();
if(x==-1)
{
printf("Impossible\n");
}
else
{
printf("%d\n",x);
}
}
return 0;
}