首相们对安全局长带来的消息感到非常不安,他们说他们将为了安全考虑改变首相房间门牌号上面的门牌号码。
——要不时地改变门牌号,这样可以使敌人处于迷惑之中。
——但是,我现在的门牌号是1033号,它是一个质数,我有质数强迫症。我不能忍受我的门牌号不是质数。
——我知道,所以你的新门牌号8179号也是一个质数。你只需在你办公室的门上更换掉原来的四个数字就可以。
——不,不是那么简单。假设我把第一个数字先改为8,那么在你更改下一个数字之前他将是8033,它不是素数!
——我明白了,首相,即使在几秒钟内,你也不能忍受一个非质数。
——是的!因此,你必须提出一种从1033改为8179而且中间全是质数的方案,每次只可以改变其中一个数位上的数字。
例如:
1033
1733
3733
3739
3779
8779
8179
此时,我们一共更改了6次数字,已知更改一次数字需要花费1英镑,因此我们需要花费6英镑。
你的任务就是写一个程序,对于任意的起始和终止数字,都求出最小花费。Input输入数据有多组,首先是一个数字n,代表之后有n组数据。
其次,在每一组输入中,都包含两个数字m和n,m代表原来的门牌号,n代表现在的门牌号。
其中,m和n都是四位数,而且不含前导0。Output每组输入输出一行,输出在此情况下的最小花费。若不存在从m到n的路径,则输出单词“Impossible”。Sample Input
——要不时地改变门牌号,这样可以使敌人处于迷惑之中。
——但是,我现在的门牌号是1033号,它是一个质数,我有质数强迫症。我不能忍受我的门牌号不是质数。
——我知道,所以你的新门牌号8179号也是一个质数。你只需在你办公室的门上更换掉原来的四个数字就可以。
——不,不是那么简单。假设我把第一个数字先改为8,那么在你更改下一个数字之前他将是8033,它不是素数!
——我明白了,首相,即使在几秒钟内,你也不能忍受一个非质数。
——是的!因此,你必须提出一种从1033改为8179而且中间全是质数的方案,每次只可以改变其中一个数位上的数字。
例如:
1033
1733
3733
3739
3779
8779
8179
此时,我们一共更改了6次数字,已知更改一次数字需要花费1英镑,因此我们需要花费6英镑。
你的任务就是写一个程序,对于任意的起始和终止数字,都求出最小花费。Input输入数据有多组,首先是一个数字n,代表之后有n组数据。
其次,在每一组输入中,都包含两个数字m和n,m代表原来的门牌号,n代表现在的门牌号。
其中,m和n都是四位数,而且不含前导0。Output每组输入输出一行,输出在此情况下的最小花费。若不存在从m到n的路径,则输出单词“Impossible”。Sample Input
3 1033 8179 1373 8017 1033 1033Sample Output
6 7 0
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
#define N 10005
using namespace std;
bool f[N];
int flag[N],dig[10],ans[N];
void isprime()
{
f[0]=1;f[1]=1;
for(int i=2;i<N;i++)
{
if(!f[i])
{
for(int j=i+i;j<N;j+=i)
{
f[j]=1;
}
}
}
}
queue<int> q;
int bfs(int s,int e)
{
q.push(s);
flag[s]=1;
ans[s]=0;
while(!q.empty())
{
int t=q.front();
q.pop();
dig[3]=t%10;//个位
dig[2]=t/10%10;//十位
dig[1]=t/100%10;//百
dig[0]=t/1000%10;//千位 //分离
for(int i=0;i<4;i++)
{
int temp=dig[i];
for(int j=0;j<=9;j++)
{
if(j==0&&i==0) continue;//千位不能为0
if(dig[i]!=j)
{
dig[i]=j;
int res=dig[0]*1000+dig[1]*100+dig[2]*10+dig[3];
if(!f[res]&&!flag[res])
{
flag[res]=1;
q.push(res);
ans[res]=ans[t]+1;
}
if(res==e) return ans[e];
}
}
dig[i]=temp;//恢复dig[i]这个数 经过 for循环 后 它就变了
}
}return -1;
}
int main()
{
int n;
isprime();
cin>>n;
while(n--)
{
int x,y;
memset(flag,0,sizeof(flag));
memset(ans,0,sizeof(ans));
while(!q.empty()) q.pop();
cin>>x>>y;
int key=bfs(x,y);
if(key!=-1) cout<<key<<endl;
else cout<<"Impossible"<<endl;
}
return 0;
}