POJ 3126 Prime Path( 广搜 )

Prime Path

Time Limit:1000MSMemory Limit:65536K

Total Submissions:12974Accepted:7342

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.1033173337333739377987798179The 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

31033 81791373 80171033 1033

Sample Output

670

题目大意:给两个素数a,b(是4位数),问a是否能通过变换,变成b,变换原则:一次只能改变a的其中一位数字,,并且转换后的数字必须也是素数,如1033能变成1733,但不能变成1233(因为1233不是素数),也不能变成3733(因为从1033到3733一次变换了2位数),若能,输出最少的变换次数,否则输出Impossible。

广搜,判断是否是素数可以先打表。

#include <stdio.h>#include <queue>#include <string.h>using namespace std;#define HUR 100#define THO 1000#define TEN 10const int maxn=10000;bool prime[maxn+5];int vis[maxn],s,e;void prime_table(){int i,j;memset(prime,0,sizeof(prime));for(i=2;i<maxn;i++)if(!prime[i])for(j=i*i;j<maxn;j+=i)prime[j]=1;}int bfs(){int i;memset(vis,0,sizeof(vis));vis[s]=1;queue<int> que;que.push(s);while(!que.empty()){int t=que.front();que.pop();int d=t;d%=1000;for(i=1;i<10;i++){int tt=d+i*THO;//变换千位if(prime[tt]==0 && vis[tt]==0){if(tt==e) return vis[t];que.push(tt);vis[tt]=vis[t]+1;}}d=t%100+(t/1000*1000);for(i=0;i<10;i++){int tt=d+i*HUR;//变换百位if(prime[tt]==0 && vis[tt]==0){if(tt==e) return vis[t];que.push(tt);vis[tt]=vis[t]+1;}}d=t%10+t/100*100;for(i=0;i<10;i++){int tt=d+i*TEN;//变换十位if(prime[tt]==0 && vis[tt]==0){if(tt==e) return vis[t];que.push(tt);vis[tt]=vis[t]+1;}}d=t/10*10;for(i=0;i<10;i++){int tt=d+i;//变换个位if(prime[tt]==0 && vis[tt]==0){if(tt==e) return vis[t];que.push(tt);vis[tt]=vis[t]+1;}}}return 0;}int main(){int T,res;prime_table();scanf("%d",&T);while(T–){scanf("%d%d",&s,&e);if(s==e){printf("0\n");continue;}res=bfs();if(res==0)printf("Impossible\n");elseprintf("%d\n",res);}return 0;}

辽远或偏僻的地方,而会常常想起这一次的旅行,想起那座山,那个城,那些人……

POJ 3126 Prime Path( 广搜 )

相关文章:

你感兴趣的文章:

标签云: