Prime Path(poj 3126)

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

 

posted @ 2013-08-26 16:26  孔凡凯凯  阅读(197)  评论(0编辑  收藏  举报