zoukankan      html  css  js  c++  java
  • POJ

     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
    ");
            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
    ");
                else printf("%d
    ",f);
            }
        }
        return 0;
    } 
  • 相关阅读:
    [转载]MAXIMO数据收集的要素探究
    cmctrl和lsnrctl
    word2007如何从第三页开始插入页码(转)
    广东电信测网速软件下载地址
    投标书如何写?(转)
    sql server 2000安装中出现:command line option syntax error,type command/? for help解决方法(转)
    LAPACK(2)——使用基础
    LAPACK(1)——安装与测试
    Ubuntu11.04网络配置与问题排除
    LAPACK(4)——矩阵特征值和特征向量的求解
  • 原文地址:https://www.cnblogs.com/yzm10/p/7241733.html
Copyright © 2011-2022 走看看