Prime Path
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 22673 | Accepted: 12561 |
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
One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).
Output
One line for each case, either with a number stating the minimal cost or containing the word Impossible.
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
每次只能变动一位,变动后必须是素数,问从n到m要几次。
水题
#include<iostream> #include<algorithm> #include<queue> #include<cstdio> #include<cstring> #include<stack> #include<cmath> using namespace std; #define PrimeMax 10000 bool Prime[PrimeMax+1]; void BuildPrime() { memset(Prime,true,sizeof(Prime)); Prime[1]=Prime[0]=false; int n=PrimeMax,m=sqrt(PrimeMax); for(int i=2; i<=m; i++) if(Prime[i]) for(int j=i*i; j<=n; j+=i) Prime[j]=false; } int NEXT[45],map[10000]; int func2(int n) { int flag=0,x[4]; x[0]=n/1000; x[3]=n%10; x[1]=(n/100)%10; x[2]=(n%100)/10; for(int i=0; i<4; i++) for(int j=0; j<10; j++) { int sum=0; for(int k=0; k<4; k++) if(k!=i) sum+=x[k]*pow(10,3-k); else sum+=j*pow(10,3-k); if(Prime[sum]&&(!map[sum])) { map[sum]=1; NEXT[flag++]=sum; } } return flag; } struct AP { int x,flag; }; AP func3(int x,int y) { AP t; t.x=x; t.flag=y; return t; } int main() { BuildPrime(); for(int i=0; i<1000; i++) Prime[i]=0; func2(1033); int N; cin>>N; while(N--) { memset(map,0,sizeof(map)); int n,m,vjudge=0; cin>>n>>m; if(n==m) { cout<<'0'<<endl; continue; } queue<AP>que1; que1.push(func3(n,0)); map[n]=1; while(que1.size()) { AP temp=que1.front(); que1.pop(); int flag=func2(temp.x); for(int i=0; i<flag; i++) { if(NEXT[i]==m) { cout<<temp.flag+1<<endl; vjudge=1; break; } map[NEXT[i]]=1; que1.push(func3(NEXT[i],temp.flag+1)); } if(vjudge) break; } if(!vjudge) cout<<"Impossible"<<endl; } return 0; }