首页 > 其他 > 详细

BNU 4188 Superprime Rib【BFS】

时间:2015-03-23 19:24:25      阅读:131      评论:0      收藏:0      [点我收藏+]

题意:给出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<<"\n";
58     } 
59     return 0;
60 }
View Code

 

BNU 4188 Superprime Rib【BFS】

原文:http://www.cnblogs.com/wuyuewoniu/p/4360717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!