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.
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 8179The 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
题目大意:问输入的第一个数金过几次变换可以得到第二个数;
变换时,每次只能改变一个数字;
经过变换得到的数字必须是素数;
不能完成输出Impossible;
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 bool pr[10003],vis[10003]; 7 int a,b,t,i,j; 8 struct node 9 { 10 int a,step; 11 }p,q; 12 void pri() 13 { 14 memset(pr,-1,sizeof(pr)); 15 pr[0]=pr[1]=0; 16 for(i=2; i<10003; i++) 17 { 18 if(pr[i]) 19 for(j=2*i; j<10003; j+=i) 20 pr[j]=0; 21 } 22 } 23 int change(int x,int i,int j) 24 {//方便改变数字的每一位,x是原数字,i代表第几位i=1是个位,j是改编成几(0————9,千位不能为0) 25 if(i==1) return (x/10)*10+j; 26 else if(i==2) return (x/100)*100+x%10+j*10; 27 else if(i==3) return (x/1000)*1000+x%100+j*100; 28 else if(i==4) return (x%1000)+j*1000; 29 } 30 void bfs()//简单bfs 31 { 32 queue<node>que; 33 p.a=a; 34 p.step=0; 35 vis[a]=1; 36 que.push(p); 37 while(!que.empty()) 38 { 39 p=que.front(); 40 que.pop(); 41 q.step=p.step+1; 42 for(i=1; i<5; i++) 43 for(j=0; j<10; j++) 44 { 45 if(i==4&&j==0) 46 continue; 47 q.a=change(p.a,i,j); 48 if(q.a==b) 49 { 50 printf("%d ",q.step); 51 return; 52 } 53 if(pr[q.a]&&!vis[q.a]) 54 { 55 que.push(q); 56 vis[q.a]=1; 57 } 58 } 59 } 60 printf("Impossible "); 61 } 62 int main() 63 { 64 pri();//素数筛初始化 65 scanf("%d",&t); 66 while(t--) 67 { 68 memset(vis,0,sizeof(vis));//初始化 69 scanf("%d %d",&a,&b); 70 if(a==b){printf("0 ");continue;}//a==b情况单独处理; 71 bfs(); 72 } 73 return 0; 74 }