Prime Path POJ--3126

来源:互联网 发布:python中文乱码解决sys 编辑:程序博客网 时间:2024/05/16 19:27

Prime Path  

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
31033 81791373 80171033 1033
Sample Output
670
题意:给你两个四位数的素数n,m,n每一次只能变一个位上的数,变成另一个四位数的偶数,问最少经过几次才能变为m;
思路:这个一看就知道是广搜,在加一些剪枝,具体的看代码。
#include<stdio.h>#include<string.h>#include<queue>using namespace std;#include<math.h>int book[10000];int prime[10002];int n,m,flag;struct note{    int x;    int step;};void prime1(){    int i,j;    for( i=1001; i<10000; i+=2)    {        int  k=sqrt(i);        for(j=2; j<=k; j++)            if(i%j==0)                break;        if(j>k)            prime[i]=1;        else prime[i]=0;    }}void bfs(){    queue<note>Q;    note now,tem;    now.x=n;    now.step=0;    book[n]=1;    Q.push(now);    while(!Q.empty())    {        now=Q.front();        Q.pop();        if(now.step==8779)            printf("%d\n",now.step);        if(now.x==m)        {            flag=1;            printf("%d\n",now.step);            break;        }        int i=3,j,a[10];        while(now.x)        {            a[i--]=now.x%10;            now.x=now.x/10;        }        for(i=0; i<4; i++)        {            int s=a[i];            for(j=0; j<10; j++)            {                a[i]=j;                int sum=a[0]*1000+a[1]*100+a[2]*10+a[3];                if(sum<1000||book[sum]||prime[sum]==0)                    continue;                book[sum]=1;                tem.x=sum;                tem.step=now.step+1;                Q.push(tem);            }            a[i]=s;        }    }    return ;}int main(){    int t;    prime1();    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&n,&m);        memset(book,0,sizeof(book));        flag=0;        bfs();        if(!flag)            printf("Impossible.\n");    }    return 0;}


原创粉丝点击