zoukankan      html  css  js  c++  java
  • POJ3126Prime Path

    转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1303623014

    大致题意:

    给定两个四位素数a  b,要求把a变换到b

    变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数    前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能重复。

     

    求从ab最少需要的变换次数。无法变换则输出Impossible

     

    解题思路:

    超级水题,40入口的BFS + 素数判定

    不过剪枝之后就没有40入口了,入口数远小于40

     

    无论是判定素数还是搜索素数,首先排除偶数,这样就剪掉一半枝叶了

    判断素数用根号法判断,

    如果一个数X不能被 [2,X] 内的所有素数整除,那么它就是素数

    可以判断的复杂度降到logn

    注意:千位的变换要保证千位不为0

          其实素数也是用来辅助搜索剪枝的

     

     

      1 //Memory Time 
    2 //212K 16MS
    3
    4 #include<iostream>
    5 using namespace std;
    6
    7 typedef class
    8 {
    9 public:
    10 int prime;
    11 int step;
    12 }number;
    13
    14 bool JudgePrime(int digit)
    15 {
    16 if(digit==2 || digit==3)
    17 return true;
    18 else if(digit<=1 || digit%2==0)
    19 return false;
    20 else if(digit>3)
    21 {
    22 for(int i=3;i*i<=digit;i+=2)
    23 if(digit%i==0)
    24 return false;
    25 return true;
    26 }
    27 }
    28
    29 int a,b;
    30 bool vist[15000];
    31 number queue[15000];
    32
    33 void BFS(void)
    34 {
    35 int i; //temporary
    36 int head,tail;
    37 queue[head=tail=0].prime=a;
    38 queue[tail++].step=0;
    39 vist[a]=true;
    40
    41 while(head<tail)
    42 {
    43 number x=queue[head++];
    44 if(x.prime==b)
    45 {
    46 cout<<x.step<<endl;
    47 return;
    48 }
    49
    50 int unit=x.prime%10; //获取x的个位
    51 int deca=(x.prime/10)%10; //获取x的十位
    52
    53 for(i=1;i<=9;i+=2) //枚举x的个位,保证四位数为奇数(偶数必不是素数)
    54 {
    55 int y=(x.prime/10)*10+i;
    56 if(y!=x.prime && !vist[y] && JudgePrime(y))
    57 {
    58 vist[y]=true;
    59 queue[tail].prime=y;
    60 queue[tail++].step=x.step+1;
    61 }
    62 }
    63 for(i=0;i<=9;i++) //枚举x的十位
    64 {
    65 int y=(x.prime/100)*100+i*10+unit;
    66 if(y!=x.prime && !vist[y] && JudgePrime(y))
    67 {
    68 vist[y]=true;
    69 queue[tail].prime=y;
    70 queue[tail++].step=x.step+1;
    71 }
    72 }
    73 for(i=0;i<=9;i++) //枚举x的百位
    74 {
    75 int y=(x.prime/1000)*1000+i*100+deca*10+unit;
    76 if(y!=x.prime && !vist[y] && JudgePrime(y))
    77 {
    78 vist[y]=true;
    79 queue[tail].prime=y;
    80 queue[tail++].step=x.step+1;
    81 }
    82 }
    83 for(i=1;i<=9;i++) //枚举x的千位,保证四位数,千位最少为1
    84 {
    85 int y=x.prime%1000+i*1000;
    86 if(y!=x.prime && !vist[y] && JudgePrime(y))
    87 {
    88 vist[y]=true;
    89 queue[tail].prime=y;
    90 queue[tail++].step=x.step+1;
    91 }
    92 }
    93
    94 }
    95
    96 cout<<"Impossible"<<endl;
    97 return;
    98 }
    99
    100 int main(void)
    101 {
    102 int test;
    103 cin>>test;
    104 while(test--)
    105 {
    106 cin>>a>>b;
    107 memset(vist,false,sizeof(vist));
    108 BFS();
    109 }
    110 return 0;
    111 }

  • 相关阅读:
    面向对象课程第三次博客总结
    面向对象课程多线程总结
    23种设计模式整理
    java中synchronized与lock的理解与应用
    关于MySQL查询优化
    mysql操作规范建议
    Linux中实体链接与符号链接详解
    获取本地ipv4地址方法(go语言)
    分库分表与负载均衡的一致性hash算法
    golang闭包的一个经典例子
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122524.html
Copyright © 2011-2022 走看看