POJ 3126 - Prime Path--BFS
Posted blame
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3126 - Prime Path--BFS相关的知识,希望对你有一定的参考价值。
题目链接:
http://poj.org/problem?id=3126
题意:
给出两个四位质数,每次操作可以改变该质数的一位数字,问最少要多少步可以从第一个质数到第二个质数。
代码:
1 #include<iostream> 2 #include<queue> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 int prime[10005]=1,1; //质数表 7 typedef struct node 8 9 friend bool operator <(node m,node n) 10 11 return m.ans>n.ans; 12 13 int a; 14 int ans; //ans是当前状态的步数 15 node; 16 void makeprime() //生成10000以内的质数表 17 18 int m=sqrt(10000); 19 for(int i=2;i<=m;i++) 20 21 if(!prime[i]) 22 23 for(int j=i*i;j<=10000;j+=i) 24 prime[j]=1; 25 26 27 28 int slove(int be,int en) 29 30 priority_queue<node> q; 31 while(!q.empty()) 32 q.pop(); 33 node kk; 34 kk.a=be; 35 kk.ans=0; 36 q.push(kk); 37 int vis[10005]; 38 memset(vis,0,sizeof(vis)); 39 vis[be]=1; 40 while(!q.empty()) 41 42 node k=q.top(); 43 node newn; 44 q.pop(); 45 if(k.a==en) 46 47 cout<<k.ans<<endl; 48 return 1; 49 50 else 51 52 int ch[5]; 53 ch[0]=k.a/1000; //将数字转化成字符 54 ch[1]=k.a/100-10*ch[0]; 55 ch[3]=k.a%10; 56 ch[2]=(k.a%100-ch[3])/10; 57 for(int i=0;i<4;i++) 58 for(int j=0;j<=9;j++) 59 60 int m=ch[i]; 61 ch[i]=j; 62 newn.a=ch[0]*1000+ch[1]*100+ch[2]*10+ch[3]; //将字符转化成数字 63 newn.ans=k.ans+1; 64 if(newn.a>=1000&&newn.a<=9999&&!vis[newn.a]&&!prime[newn.a]) //判断生成的数字是否合法 65 66 newn.ans=k.ans+1; 67 vis[newn.a]=1; 68 q.push(newn); 69 70 ch[i]=m; //回溯 71 72 73 74 cout<<"Impossible"<<endl; 75 76 int main() 77 78 int n; 79 cin>>n; 80 makeprime(); 81 while(n--) 82 83 int a,b; 84 cin>>a>>b; 85 slove(a,b); 86 87
以上是关于POJ 3126 - Prime Path--BFS的主要内容,如果未能解决你的问题,请参考以下文章