Prime Path
Time Limit: 1000MS
Memory Limit:65536K
Total Submissions: 6713
Accepted:3808
Description
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices.
— 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.
1033
1733
3733
3739
3779
8779
8179
The 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.
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
1: #include <iostream>
2: #include <queue>
3: #include <cstring>
4: #include <cmath>
5: #include <cstdio>
6: using namespace std;
7: int first,last;
8: int step[10000];
9: bool isPrime(int a)
10: {
11: bool flag=true;
12: for(int i=2;i<=(sqrt(float(a)));++i)
13: if(a%i==0){flag=false;break;}
14: return flag;
15: }
16: int bfs()
17: {
18: memset(step,-1,sizeof(step));
19: queue<int> s;
20: s.push(first);
21: step[first] = 0;
22: int temp;
23: while(!s.empty())
24: {
25: int dequeue = s.front();
26: s.pop();
27: if(dequeue == last)
28: return step[dequeue];
29: for(int i=0;i<10;++i)
30: {
31: temp = (dequeue/10)*10+i;
32: if(isPrime(temp) && step[temp] == -1)
33: {
34: step[temp] = step[dequeue] + 1;
35: s.push(temp);
36: }
37: }
38: for(int i=0;i<10;++i)
39: {
40: temp = (dequeue/100)*100+dequeue%10+i*10;
41: if(isPrime(temp) && step[temp] == -1)
42: {
43: step[temp] = step[dequeue] + 1;
44: s.push(temp);
45: }
46: }
47: for(int i=0;i<10;++i)
48: {
49: temp = (dequeue/1000)*1000+dequeue%100+i*100;
50: if(isPrime(temp) && step[temp] == -1)
51: {
52: step[temp] = step[dequeue] + 1;
53: s.push(temp);
54: }
55: }
56: for(int i=1;i<10;++i)
57: {
58: temp = dequeue%1000+i*1000;
59: if(isPrime(temp) && step[temp] == -1)
60: {
61: step[temp] = step[dequeue] + 1;
62: s.push(temp);
63: }
64: }
65:
66: }
67: return -1;
68: }
69: int main()
70: {
71: int n,result;
72: scanf("%d",&n);
73: while(n--)
74: {
75: scanf("%d%d",&first,&last);
76: result = bfs();
77: if(result == -1) printf("Impossible\n");
78: else printf("%d\n",result);
79: }
80: return 0;
81: }