Description
![](https://i-blog.csdnimg.cn/blog_migrate/d37b8f74a1ac07badfe42aa484f8ebcb.jpeg)
— It is a matter of security to change such things every now and then, to keep the enemy in the dark.
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know!
— I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door.
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime!
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds.
— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime.
Now, the minister of finance, who had been eavesdropping, intervened.
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound.
— Hmm, in that case I need a computer program to minimize the cost. You don't know some very cheap software gurus, do you?
— In fact, I do. You see, there is this programming contest going on... Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above.
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
题目分析
从一个素数变到另一个素数,每次只能变一个数字,而且重新生成的也必为整数,求出最小需要的次数并输出
解题思路
找呗,从素数变到素数,个位数字一定是奇数,可以枚举各个位置上的数,广搜,满足要求的就加入队列,直到变换成功
源代码
#include<iostream>
#include<queue>
#include<string.h>
#include<cstring>
#include<cmath>
#include<math.h>
using namespace std;
struct fuck
{
int num,stp;
}now;
queue<fuck> q;
int v[10000],a,b,x,stpp,numm;
int sushu(int k)
{
for(int i=2;i<=(int)sqrt(k);i++)
{
if(k%i==0)
return 0;
}
return 1;
}
void bfs()
{
now.num=a;
now.stp=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.num==b)
{
cout<<now.stp<<endl;
return;
}
else
{
int i;
numm=now.num;
stpp=now.stp;
for(i=1;i<=9;i+=2)
{
x=numm/10*10+i;
if(!v[x]&&sushu(x))
{
v[x]=1;
now.num=x;
now.stp=stpp+1;
q.push(now);
}
}
for(i=0;i<=9;i++)
{
x=numm/100*100+i*10+numm%10;
if(!v[x]&&sushu(x))
{
v[x]=1;
now.num=x;
now.stp=stpp+1;
q.push(now);
}
x=numm/1000*1000+i*100+numm%100;
if(!v[x]&&sushu(x))
{
v[x]=1;
now.num=x;
now.stp=stpp+1;
q.push(now);
}
}
for(i=1;i<=9;i++)
{
x=numm%1000+i*1000;
if(!v[x]&&sushu(x))
{
v[x]=1;
now.num=x;
now.stp=stpp+1;
q.push(now);
}
}
}
}
cout<<"Impossible"<<endl;
return;
}
int main()
{
int t;
cin>>t;
while(t--)
{
while(!q.empty())q.pop();
memset(v,0,sizeof(v));
cin>>a>>b;
v[a]=1;
bfs();
}
return 0;
}