poj3126 Prime Path 容器+素数筛法 (o^2)

来源:互联网 发布:该怎样正确使用网络 编辑:程序博客网 时间:2024/05/25 19:56

#include<iostream>#include<algorithm>#include<queue>using namespace std;const int N=10000;const int INF=10000;bool isprime[N];void initprime(){fill(isprime,isprime+N,true);//for(int i=0;i<N;i++)//isprime[i]=true;for(int i=2;i<N;i++)  //将所有的素数标记为真if(isprime[i])for(int j=i*i;j<N;j+=i)isprime[j]=false;}int d[N];// 存到达某点的步数 还有标记的作用int BFS(int begin,int end)   //宽搜一下子{int i,j;queue<int> q;for(i=1000;i<N;i++)d[i]=INF;    //初始化为无穷大q.push(begin);//将起点放入容器d[begin]=0;  //并且该点为0while(q.size())//容器大小为真时 继续{        int p=q.front();//取出第一个元素赋给p        q.pop();  //并且删除该点        if(p==end) //控制结束条件  找到该点直接结束break;for(i=1;i<=1000;i*=10)//i共可进行3次循环{int m=(p/i)%10;  //1234 取每个位数上的数for(j=0;j<=9;j++)//  1234 在 123(0到9)之间遍历一遍 且不会遍历取出来的m 由此实现 了题目的要求{if(j==m)continue;if(j==0&&i==1000)continue;int n=p+(j-m)*i;//得到某一个数if(isprime[n]&&d[n]==INF)//d[]数组可以实现标记 还有步数的叠加{q.push(n);   //将1000到9999里里面的所有素数都求出来d[n]=d[p]+1;  //到达该素数所用的步数}}}}return d[end];}int main(){int t,begin,end;initprime();//实现标记素数cin>>t;while(t--){cin>>begin>>end;int res=BFS(begin,end);if(res==INF)cout<<"impossible!"<<endl;elsecout<<res<<endl;}return 0;}