Prime Path
Time Limit: 2000/1000 ms (Java/Other) Memory Limit: 131072/65536 K (Java/Other)
Total Submission (s): 6 Accepted Submission (s): 6
Problem Description
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they wowould 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! Also 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
Source
PKU
[Cpp]
// 8.16.cpp: defines the entry point of the console application.
//
# Include "stdafx. h"
# Include <cstdio>
# Include <queue>
# Include <cstring>
# Define MEM (arr, w) memset (arr, w, sizeof (arr ))
# Deprecision MAX 10000
# Define INF 0x3f3f3f
Using namespace std;
Int prime [MAX + 2] = {0 };
Int num [4];
Int visit [MAX], step [MAX];
Int st, ed, mint, ss, tt;
Void Prime ()
{
For (int I = 2; I <MAX; I ++)
{
If (! Prime [I])
{
For (int j = I <1; j <MAX; j + = I)
Prime [j] = 1;
}
}
}
Void Init ()
{
MEM (visit, false );
MEM (step, 0 );
Mint = INF;
}
Void BFS ()
{
Queue <int> Q;
Q. push (st );
Visit [st] = true;
Step [st] = 0;
While (! Q. empty ())
{
Ss = Q. front ();
Q. pop ();
If (ss = ed) if (step [ss] <mint) mint = step [ss];
For (int I = 0; I <4; I ++)
{
Num [0] = ss % 10, num [1] = ss/10% 10, num [2] = ss/100% 10, num [3] = ss/1000;
For (int j = 0; j <= 9; j ++)
{
Num [I] = j;
Tt = num [3] * 1000 + num [2] * 100 + num [1] * 10 + num [0];
If (! Prime [tt] &! Visit [tt] And & tt> 1000)
{
Visit [tt] = true;
Q. push (tt );
Step [tt] = step [ss] + 1;
}
}
}
}
Return;
}
Int main ()
{
Int T;
Prime ();
Scanf ("% d", & T );
While (T --)
{
Scanf ("% d", & st, & ed );
Init ();
BFS ();
If (mint! = INF) printf ("% d \ n", mint );
Else printf ("Impossible \ n ");
}
Return 0;
}