首页 > 代码库 > poj3126 筛素数+bfs
poj3126 筛素数+bfs
1 //Accepted 212 KB 16 ms 2 //筛素数+bfs 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <queue> 7 using namespace std; 8 const int inf = 100000000; 9 const int imax_n = 10005; 10 bool pri[imax_n]; 11 bool vis[imax_n]; 12 void prime() 13 { 14 for (int i=2;i<imax_n;i++) 15 { 16 for (int j=i*i;j<imax_n;j+=i) 17 { 18 pri[j]=1; 19 } 20 } 21 pri[0]=pri[1]=1; 22 } 23 queue<int > q,step; 24 int ans; 25 void bfs(int s,int e) 26 { 27 while (!q.empty()) q.pop(); 28 while (!step.empty()) step.pop(); 29 memset(vis,false,sizeof(vis)); 30 ans=inf; 31 q.push(s); 32 vis[s]=true; 33 step.push(0); 34 while (!q.empty()) 35 { 36 int x=q.front(); 37 q.pop(); 38 int temp_step=step.front(); 39 step.pop(); 40 if (x==e) 41 { 42 ans=temp_step; 43 return ; 44 } 45 int t=x%1000; 46 for (int i=1;i<=9;i++) 47 { 48 int nx=t+i*1000; 49 if (pri[nx]==0 && !vis[nx]) 50 { 51 q.push(nx); 52 step.push(temp_step+1); 53 vis[nx]=true; 54 } 55 } 56 t=(x%1000)%100+x/1000*1000; 57 for (int i=0;i<=9;i++) 58 { 59 int nx=t+i*100; 60 if (pri[nx]==0 && !vis[nx]) 61 { 62 q.push(nx); 63 step.push(temp_step+1); 64 vis[nx]=true; 65 } 66 } 67 t=x/100*100+x%100%10; 68 for (int i=0;i<=9;i++) 69 { 70 int nx=t+i*10; 71 if (pri[nx]==0 && !vis[nx]) 72 { 73 q.push(nx); 74 step.push(temp_step+1); 75 vis[nx]=true; 76 } 77 } 78 t=x/10*10; 79 for (int i=1;i<=9;i+=2) 80 { 81 int nx=t+i; 82 if (pri[nx]==0 && !vis[nx]) 83 { 84 q.push(nx); 85 step.push(temp_step+1); 86 vis[nx]=true; 87 } 88 } 89 } 90 } 91 int main() 92 { 93 prime(); 94 int T; 95 scanf("%d",&T); 96 while (T--) 97 { 98 int a,b; 99 scanf("%d%d",&a,&b);100 bfs(a,b);101 if (ans==inf)102 printf("Impossible\n");103 else104 printf("%d\n",ans);105 }106 return 0;107 }
poj3126 筛素数+bfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。