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

    Prime Path

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 21   Accepted Submission(s) : 18
    Problem 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
    PKU
     
    题意:
    给出两个四位的素数,要求求出从其中一个变化到另一个数的最少的变化次数,每一次变化只变化四位中的一位,并且变化后的数也要是素数;
    思路:
    bfs,只不过是40入口的bfs,需要经过剪枝;每一次都枚举个位、十位、百位、千位的所有变化,检验室素数后加入到队列中;
    AC代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 
     5 
     6 using namespace std;
     7 int a,b;
     8 struct kf
     9 {
    10     int number;
    11     int sgin;
    12 }ks[111111];
    13 bool ksgin[10100]={false};
    14 
    15 
    16 
    17 bool shu(int sg)//判断sg是否是素数
    18 {
    19     if(sg==2||sg==3)
    20         return true;
    21     else if(sg<=1||sg%2==0)
    22         return false;
    23     else if(sg>3)
    24     {
    25         for(int i=3;i*i<=sg;i+=2)
    26             if(sg%i==0)
    27                 return false;
    28         return true;
    29     }
    30 }
    31 
    32 
    33 int bfs()
    34 {
    35     int left,right;
    36     kf s;
    37     ks[left=right=0].number=a;
    38     ks[right++].sgin=0;
    39     ksgin[a]=false;
    40     while(left<right){
    41         s=ks[left++];
    42         if(s.number==b){
    43             cout<<s.sgin<<endl;
    44             return 0;
    45         }
    46         int ge=s.number%10;
    47         int shi=(s.number/10)%10;
    48         for(int i=1;i<=9;i+=2){//枚举个位
    49             int y=s.number/10*10+i;
    50             if(y!=s.number&&ksgin[y]&&shu(y)){
    51                 ksgin[y]=false;
    52                 ks[right].number=y;
    53                 ks[right++].sgin=s.sgin+1;
    54             }
    55         }
    56         for(int i=0;i<=9;i++){//枚举十位
    57             int y=s.number/100*100+i*10+ge;
    58             if(y!=s.number&&ksgin[y]&&shu(y)){
    59                 ksgin[y]=false;
    60                 ks[right].number=y;
    61                 ks[right++].sgin=s.sgin+1;
    62             }
    63         }
    64         shi*=10;
    65         shi+=ge;
    66         for(int i=0;i<=9;i++){//枚举百位
    67             int y=s.number/1000*1000+i*100+shi;
    68             if(y!=s.number&&ksgin[y]&&shu(y)){
    69                 ksgin[y]=false;
    70                 ks[right].number=y;
    71                 ks[right++].sgin=s.sgin+1;
    72             }
    73         }
    74         shi=s.number%1000;
    75         for(int i=1;i<=9;i++){//千位
    76             int y=i*1000+shi;
    77             if(y!=s.number&&ksgin[y]&&shu(y)){
    78                 ksgin[y]=false;
    79                 ks[right].number=y;
    80                 ks[right++].sgin=s.sgin+1;
    81             }
    82         }
    83     }
    84     cout<<"Impossible"<<endl;
    85     return 0;
    86 }
    87 
    88 
    89 int main()
    90 {
    91 //    freopen("input.txt","r",stdin);
    92     int test;
    93     cin>>test;
    94     while(test--){
    95         memset(ksgin,true,sizeof(ksgin));
    96         cin>>a>>b;
    97         bfs();
    98     }
    99 }
    View Code

  • 相关阅读:
    清除ListBox的列表项(删除所有项目)
    创建对象
    搜索功能
    为下拉式菜单(DropDownList)添加第一个选项
    事件接口
    用户控件(UserControl) 使用事件 Ver2
    MS SQL动态创建临时表
    炒粉还是煮面
    输入数字动态创建行
    DataList中TextBox onfocus调用后台静态方法
  • 原文地址:https://www.cnblogs.com/zhangchengbing/p/3380574.html
Copyright © 2011-2022 走看看