Prime Path
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 16991 | Accepted: 9561 |
Description

— 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 m(主要的)inister, you know!
— I know, so therefore your new number 8179 is also a prime. You will just have to paste f(张贴)our new digits o(数字)ver 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 f(计划)or 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 t(使减到最少)he cost. You don't know some very cheap software gurus, (古鲁)do you?
— In fact, I do. You see, there is this programming contest g(竞赛)oing 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 i(解决方案)n 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#include<stdio.h> #include<string.h> #include<math.h> #include<queue> using namespace std; struct node { int x; int step; }tmp,tmp1; int vis[10000]; int judge(int x) { int i; if(x==1||x==0||x==2) return 0; else { for(i=2;i<=sqrt(x);i++) { if(x%i==0) return 0; } return 1; } } void work() { int n,m,i,x; scanf("%d%d",&n,&m); int flag=0; vis[n]=1; tmp.x=n; tmp.step=0; queue<node>q; q.push(tmp); while(!q.empty()) { tmp=q.front(); q.pop(); if(tmp.x==m) { printf("%d\n",tmp.step); flag=1; break; } tmp.step++; for(i=0;i<=9;i++) { x=tmp.x/10*10+i; if(judge(x)&&!vis[x]) { tmp1=tmp; tmp1.x=x; vis[x]=1; q.push(tmp1); } } for(i=0;i<=9;i++) { x=tmp.x/100*100+i*10+tmp.x%10; if(judge(x)&&!vis[x]) { tmp1=tmp; tmp1.x=x; vis[x]=1; q.push(tmp1); } } for(i=0;i<=9;i++) { x=tmp.x/1000*1000+i*100+tmp.x%100; if(judge(x)&&!vis[x]) { tmp1=tmp; tmp1.x=x; vis[x]=1; q.push(tmp1); } } for(i=1;i<=9;i++) { x=i*1000+tmp.x%1000; if(judge(x)&&!vis[x]) { tmp1=tmp; tmp1.x=x; vis[x]=1; q.push(tmp1); } } } if(!flag) printf("Impossible\n"); } int main() { int t; //int m,n; int i,j; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); work(); } return 0; }