zoukankan      html  css  js  c++  java
  • Poj 3126 Prime Path

    1.Link:

    http://poj.org/problem?id=3126

    2.Content:

    Prime Path
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11757   Accepted: 6675

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

    Source

    3.Method:

    4.Code:

     1 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 #define MAX 10002
     5 //#define MAX 102
     6 int a[MAX];
     7 int b[MAX];
     8 int main()
     9 {
    10     int n,m;
    11     int i,j;
    12     int x,y;
    13     int k;
    14     queue<int> q;
    15     a[2]=0; 
    16     for(i=4;i<MAX;i+=2) a[i]=1; 
    17     for(i=3;i<=MAX/2;i++)
    18     {
    19         if(a[i]==0)
    20         {
    21            for(j=i;j<MAX/i;j+=2)
    22            {
    23                a[i*j]=1;     
    24            }
    25         }
    26     }
    27     //验证素数表的正确性
    28     /*for(i=2;i<MAX;i++)
    29     {
    30        if(a[i]==1) printf("%d是素数
    ",i);
    31        else printf("%d不是素数
    ",i);
    32     }*/ 
    33     cin>>n;
    34     for(int ii=0;ii<n;ii++)
    35     {
    36         cin>>x>>y;
    37         for(j=0;j<MAX;j++) b[j]=-1;
    38         while(!q.empty()) q.pop();
    39         q.push(x);
    40         b[x]=0;
    41         while(!q.empty())
    42         {
    43             m=q.front();
    44             if(m==y) break;
    45             else
    46             {
    47                 for(i=0;i<4;i++)
    48                 {
    49                     k=1;
    50                     for(j=0;j<i;j++) k=k*10;
    51                     for(j=-9;j<=9;j++)
    52                     {
    53                         if(((m/(k*10))==((m+j*k)/(k*10)))&&(a[m+j*k]==0)&&(b[m+j*k]==-1)&&(m+j*k)>=1000)
    54                         {
    55                              //printf("perfect");
    56                              b[m+j*k]=b[m]+1;
    57                              q.push(m+j*k);
    58                         }
    59                     }
    60                 }
    61             }
    62             q.pop();
    63         }
    64         cout<<b[y]<<endl;   
    65     }
    66     //system("pause");
    67     return 1;
    68 }

    5.Reference:

  • 相关阅读:
    043_MySQL 索引原理 与 慢查询优化
    042_MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
    041_SQL逻辑查询语句执行顺序
    039_MySQL 数据操作
    040_数据库设计三范式
    039_MySQL_多表查询
    039_MySQL_单表查询
    038_MySQL 表的操作
    MySQL 存储引擎
    037_MySQL操作
  • 原文地址:https://www.cnblogs.com/mobileliker/p/4068285.html
Copyright © 2011-2022 走看看