zoukankan      html  css  js  c++  java
  • Prime Path(poj 3126)

    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

    题目大意:问输入的第一个数金过几次变换可以得到第二个数;
    变换时,每次只能改变一个数字;
    经过变换得到的数字必须是素数;
    不能完成输出Impossible;
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 using namespace std;
     6 bool pr[10003],vis[10003];
     7 int a,b,t,i,j;
     8 struct node
     9 {
    10     int a,step;
    11 }p,q;
    12 void pri()
    13 {
    14     memset(pr,-1,sizeof(pr));
    15     pr[0]=pr[1]=0;
    16     for(i=2; i<10003; i++)
    17     {
    18         if(pr[i])
    19             for(j=2*i; j<10003; j+=i)
    20                 pr[j]=0;
    21     }
    22 }
    23 int change(int x,int i,int j)
    24 {//方便改变数字的每一位,x是原数字,i代表第几位i=1是个位,j是改编成几(0————9,千位不能为0)
    25     if(i==1) return (x/10)*10+j;
    26     else if(i==2) return (x/100)*100+x%10+j*10;
    27     else if(i==3) return (x/1000)*1000+x%100+j*100;
    28     else if(i==4) return (x%1000)+j*1000;
    29 }
    30 void bfs()//简单bfs
    31 {
    32     queue<node>que;
    33     p.a=a;
    34     p.step=0;
    35     vis[a]=1;
    36     que.push(p);
    37     while(!que.empty())
    38     {
    39         p=que.front();
    40         que.pop();
    41         q.step=p.step+1;
    42         for(i=1; i<5; i++)
    43             for(j=0; j<10; j++)
    44             {
    45                 if(i==4&&j==0)
    46                     continue;
    47                 q.a=change(p.a,i,j);
    48                 if(q.a==b)
    49                 {
    50                     printf("%d
    ",q.step);
    51                     return;
    52                 }
    53                 if(pr[q.a]&&!vis[q.a])
    54                 {
    55                     que.push(q);
    56                     vis[q.a]=1;
    57                 }
    58             }
    59     }
    60     printf("Impossible
    ");
    61 }
    62 int main()
    63 {
    64     pri();//素数筛初始化
    65     scanf("%d",&t);
    66     while(t--)
    67     {
    68         memset(vis,0,sizeof(vis));//初始化
    69         scanf("%d %d",&a,&b);
    70         if(a==b){printf("0
    ");continue;}//a==b情况单独处理;
    71         bfs();
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    十六、JSONObject与JSONArray使用-不刷新页面做回写显示
    十二、js去掉空格_比较字符长度_中英文判断_页面初始化_简体字与繁字体判断
    十、页面加载时对复选框、下拉列表、单选框默认进行选中及提交请求时判断单选按钮是否选中
    一、什么是Velocity及简单示例
    十八、oracle查看、扩展表空间及linux服务器硬盘容量大小查看
    接口限流算法
    浅析负载均衡的6种算法,Ngnix的5种算法
    今天是JAVA诞生日
    浅谈Spring中JDK动态代理与CGLIB动态代理
    Docker基本命令汇总
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/3282907.html
Copyright © 2011-2022 走看看