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
题目大意:问输入的第一个数金过几次变换可以得到第二个数;
变换时,每次只能改变一个数字;
经过变换得到的数字必须是素数;
不能完成输出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\n",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\n");
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\n");continue;}//a==b情况单独处理;
71 bfs();
72 }
73 return 0;
74 }
View Code