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

解题思路:

利用广度优先算法,枚举每一个素数,得到目标素数的层数就是最短路径

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <string>
#include <queue>
using namespace std;
const int MAXN = 10010;   //最大数
int N;
bool tis_Prime[MAXN];  //prime质因子
bool isVisi[MAXN];
void euraSelect() {
	tis_Prime[1] = false;  //第一个数排除
	for (int i = 2; i*i < MAXN; ++i) {
		if (tis_Prime[i] == true) {
			for (int j = i * i; j < MAXN; j += i) {
				tis_Prime[j] = false;  //排除
			}
		}
	}
}

int main() {
    //打表
	memset(tis_Prime, true, sizeof(tis_Prime));
	euraSelect();   
	cin >> N;
	string X, Y;
	while (N--) {
		int minCost = -1;
		cin >> X >> Y;
		memset(isVisi, false, sizeof(isVisi));
		queue<string> bfs_queue;
		queue<int> layer_queue;
		bfs_queue.push(X);
		layer_queue.push(0);
		while (!bfs_queue.empty()) {
			string curPrime = bfs_queue.front();
			int curLayer = layer_queue.front();
			bfs_queue.pop(), layer_queue.pop();
			if (curPrime == Y) {
				minCost = curLayer;
				break;
			}
			for (int i = 9; i >= 1; --i) {   //千位
				string TempStr = curPrime;
				if(TempStr[0] == i+'0') continue;
				TempStr[0] = i + '0';
				if (tis_Prime[atoi(TempStr.c_str())] && !isVisi[atoi(TempStr.c_str())]) {
					isVisi[atoi(TempStr.c_str())] = true;
					bfs_queue.push(TempStr);
					layer_queue.push(curLayer + 1);
				}
			}
			for (int i = 0; i <= 9; ++i) {   //百位
				string TempStr = curPrime;
				if (TempStr[1] == i + '0') continue;
				TempStr[1] = i + '0';
				if (tis_Prime[atoi(TempStr.c_str())] && !isVisi[atoi(TempStr.c_str())]) {
					isVisi[atoi(TempStr.c_str())] = true;
					bfs_queue.push(TempStr);
					layer_queue.push(curLayer + 1);
				}
			}for (int i = 0; i <= 9; ++i) {
				string TempStr = curPrime;
				if (TempStr[2] == i + '0') continue;
				TempStr[2] = i + '0';
				if (tis_Prime[atoi(TempStr.c_str())] && !isVisi[atoi(TempStr.c_str())]) {
					isVisi[atoi(TempStr.c_str())] = true;
					bfs_queue.push(TempStr);
					layer_queue.push(curLayer + 1);
				}
			}for (int i = 1; i <= 9; i+=2) {
				string TempStr = curPrime;
				if (TempStr[3] == i + '0') continue;
				TempStr[3] = i + '0';
				if (tis_Prime[atoi(TempStr.c_str())] && !isVisi[atoi(TempStr.c_str())]) {
					isVisi[atoi(TempStr.c_str())] = true;
					bfs_queue.push(TempStr);
					layer_queue.push(curLayer + 1);
				}
			}
		}
		if (minCost == -1) {
			cout << "Impossible." << endl;
		}
		else {
			cout << minCost << endl;
		}
	}

 	system("PAUSE");
	return 0;
}