zoukankan      html  css  js  c++  java
  • BNU 4188 Superprime Rib【BFS】

    题意:给出n,输出n位超级质数,超级质数的定义为“依次去掉右边一位后仍然为质数的数”

    因为一个n位质数去掉右边一位数之后仍然为质数,说明它是由n-1位超级质数演变而来的,

    同理,n-1位超级质数也由n-2位超级质数演变而来- - -- - 所以按照位数从第一位广搜到n位即可

    注意的地方是判重,最开始用的是一个vis[]数组,可是因为位数有8位,mle了 后来又想把每个数分成两半,比如73939133,可以这样判断vis[7393][9133]是否为1,= =后来发现这样用的内存貌似更多= =

    最后用set就可以了,把搜到的符合题意的都放进去set里面,再输出set里面的元素就可以了,因为set里面的元素不重复

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath> 
     5 #include<stack>
     6 #include<set>
     7 #include<vector>
     8 #include<map> 
     9 
    10 #include<queue> 
    11 #include<algorithm>  
    12 #define mod=1e9+7;
    13 using namespace std;
    14 
    15 typedef long long LL;
    16 int n;
    17 set<int> p;
    18 
    19 
    20 
    21 int prime(int n){
    22     if(n<2) return 0;
    23     for(int i=2;i<=sqrt(double(n));i++)
    24     if(n%i==0) return 0;
    25     return 1;
    26 }
    27 
    28 
    29 void bfs(){
    30     int head,next;
    31     queue<int>q;
    32     q.push(0);
    33     int tmp=0;
    34     
    35     while(tmp++<n){
    36         int size=q.size();
    37         while(size--){
    38             head=q.front();q.pop();
    39             if(n==1) p.insert(2);
    40             if(tmp==1&&n!=1) q.push(2);
    41             
    42             for(int i=0;i<=9;i++){
    43                 next=head*10+i;
    44                 if(prime(next)){
    45                     if(tmp==n) p.insert(next);
    46                     else q.push(next);
    47                 }                
    48             }            
    49         }
    50     }
    51 }
    52 int main(){
    53     while(scanf("%d",&n)!=EOF){
    54         p.clear();
    55         bfs();
    56         for(set<int>::iterator it=p.begin();it!=p.end();++it)
    57         cout<<*it<<"
    ";
    58     } 
    59     return 0;
    60 }
    View Code

    另外还有一个地方就是(因为是看的一个pdf上的),在判断队列的时候,用size=q.size();while(size--)来判断队列是否为空

    自己写的时候,写的是while(!q.empty()),后来发现这样会陷入死循环,当n>=2时,队列里面始终有2= =还木有改出来

  • 相关阅读:
    linq 查询 过滤数据中某个值是否在数组中
    Nginx 摘要
    Unity调用外部摄像头,全屏显示摄像头画面
    Vuforia切换回识别场景后黑屏解决
    Unity3d通过脚本生成apk
    EF6 CodeFirst连接MySql 报nvarchar('max')错误解决办法
    UNITY_MATRIX_MVP和UnityObjectToClipPos
    Unity的stateMachineBehaviour
    U3D加载服务器上的assetbundle
    jquery解析xml,获取xml标签名
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4360717.html
Copyright © 2011-2022 走看看