Prime Path
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions:24540 | Accepted: 13528 |
Description
![](https://i-blog.csdnimg.cn/blog_migrate/d37b8f74a1ac07badfe42aa484f8ebcb.jpeg)
— 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.
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
把四位数的素数存到一个字符串中,进行bfs,只要有三个相同就放入队列 直到找到所找的元素 代码: #include<cstdio> #include<map> #include<iostream> #include<queue> #include<string.h> bool prim[10004]; char t[10003][5]; using namespace std; struct node { char a,b,c,d; int step; }; queue<node>P; int main() { memset(prim,1,sizeof(prim)); int k=0; for(int i=2;i<=9999;i++) { if(prim[i]&&i>=1000) { int y=i; t[++k][3]=y%10+'0';y=y/10; t[k][2]=y%10+'0';y=y/10; t[k][1]=y%10+'0';y=y/10; t[k][0]=y+'0'; //注意存的顺序要一致 } if(prim[i]) { for(int j=i+i;j<=9999;j=j+i) prim[j]=0; } } int T;scanf("%d",&T); while(T--) { char r1[5],r2[5];scanf("%s %s",&r1,&r2); bool mp[10004]; memset(mp,0,sizeof(mp)); node r;r.a=r1[0],r.b=r1[1],r.c=r1[2],r.d=r1[3]; r.step=0;P.push(r); bool bb=0; while(!P.empty()) { r=P.front();P.pop(); char a=r.a,b=r.b,c=r.c,d=r.d; if(a==r2[0]&&b==r2[1]&&c==r2[2]&&d==r2[3]) { bb=1;printf("%d\n",r.step); break; } for(int i=1;i<=k;i++) { if(t[i][0]==a&&t[i][1]==b&&t[i][2]==c&&t[i][3]==d) continue; char a1=t[i][0],b1=t[i][1],c1=t[i][2],d1=t[i][3]; if((a==a1&&b==b1&&c==c1)||(b==b1&&c==c1&&d==d1)||(a==a1&&c==c1&&d==d1)||(a==a1&&b==b1&&d==d1)) { if(!mp[i]) { mp[i]=1; node e;e.a=a1;e.b=b1;e.c=c1;e.d=d1; e.step=r.step+1; P.push(e); } } } if(bb)break; } if(!bb)printf("Impossible\n"); while(!P.empty())P.pop(); } return 0; }