POJ - 3126 Prime Path 素数筛选+BFS

 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

3
1033 8179
1373 8017
1033 1033

Sample Output

6
7
0


题意:题目较长,实际就是给你两个四位素数,让你每次只能更改第一个素数的其中一位,更改后要求也是素数且位数不变,问你至少需要更改几次才能变成第二个素数。无解输出Impossible。
思路:本题涉及到素数,每次更改后均需要判断,所以避免重复计算,在程序开始先用筛法把每个四位数的素数性提前存到数组prime。之后分别更改一位数值(第一位不可能是0,最后一位只能是奇数),记录下变更次数即可。

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

int prime[10005],bo[10005];
struct Node{
    int x,s;
}node;

int main()
{
    int t,a,b,f,i,j;
    prime[1]=1;
    for(i=2;i<=10000;i++){
        if(!prime[i]){
            for(j=2;i*j<=10000;j++){
                prime[i*j]=1;     //素数筛选
            } 
        } 
    }
    scanf("%d",&t);
    while(t--){
        queue<Node> q;
        memset(bo,0,sizeof(bo));
        scanf("%d%d",&a,&b);
        if(a==b) printf("0\n");
        else{
            bo[a]=1;
            node.x=a;
            node.s=0;
            q.push(node);
            f=0;
            while(q.size()){
                int tx=q.front().x;
                for(i=0;i<=9;i++){
                    if(i!=tx%10&&!prime[tx-tx%10+i]&&bo[tx-tx%10+i]==0){
                        if(tx-tx%10+i==b){
                            f=q.front().s+1;
                            break;
                        }
                        bo[tx-tx%10+i]=1;
                        node.x=tx-tx%10+i;
                        node.s=q.front().s+1;
                        q.push(node);
                    }
                    if(i!=tx/10%10&&!prime[tx-tx/10%10*10+i*10]&&bo[tx-tx/10%10*10+i*10]==0){
                        if(tx-tx/10%10*10+i*10==b){
                            f=q.front().s+1;
                            break;
                        }
                        bo[tx-tx/10%10*10+i*10]=1;
                        node.x=tx-tx/10%10*10+i*10;
                        node.s=q.front().s+1;
                        q.push(node);
                    }
                    if(i!=tx/100%10&&!prime[tx-tx/100%10*100+i*100]&&bo[tx-tx/100%10*100+i*100]==0){
                        if(tx-tx/100%10*100+i*100==b){
                            f=q.front().s+1;
                            break;
                        }
                        bo[tx-tx/100%10*100+i*100]=1;
                        node.x=tx-tx/100%10*100+i*100;
                        node.s=q.front().s+1;
                        q.push(node);
                    }
                    if(i!=0&&i!=tx/1000&&!prime[tx-tx/1000*1000+i*1000]&&bo[tx-tx/1000*1000+i*1000]==0){
                        if(tx-tx/1000*1000+i*1000==b){
                            f=q.front().s+1;
                            break;
                        }
                        bo[tx-tx/1000*1000+i*1000]=1;
                        node.x=tx-tx/1000*1000+i*1000;
                        node.s=q.front().s+1;
                        q.push(node);
                    }
                }
                if(f!=0) break;
                q.pop();
            }
            if(f==0) printf("Impossible\n");
            else printf("%d\n",f);
        }
    }
    return 0;
} 

 

posted @ 2017-07-26 20:19  yzm10  阅读(202)  评论(0编辑  收藏  举报