poj 3126Prime Path

来源:互联网 发布:平板软件市场hd 编辑:程序博客网 时间:2024/05/01 11:56

题意很简单:两个四位数的素数通过改变某一位,得到另一个素数,这样一直操作下去,求当m变成n时最少的操作次数?分析可知道,求最短的操作步数肯定要用BFS,因为要求素数所以要筛选素数求出素数。这题很简单一次就过而且时间仅有0MS哦!

 

代码:

#include<iostream>#include<queue>using namespace std;queue<int>q;int ans[10000];bool visit[10000],prime[10000];int bfs(int m,int n){    memset(ans,0,sizeof(ans));    int p;    while(!q.empty()) q.pop();    q.push(m);    visit[m]=1;    if(visit[n]) return ans[n];    while(!q.empty())    {      p=q.front();      q.pop();      for(int i=0;i<=9;i++)      {        if(prime[p/10*10+i]&&!visit[p/10*10+i])        {           q.push(p/10*10+i);           ans[p/10*10+i]=ans[p]+1;           visit[p/10*10+i]=1;        }        if(prime[p/100*100+p%10+i*10]&&!visit[p/100*100+p%10+i*10])        {           q.push(p/100*100+p%10+i*10);           ans[p/100*100+p%10+i*10]=ans[p]+1;           visit[p/100*100+p%10+i*10]=1;                                                                                                                            }        if(prime[p/1000*1000+p%100+i*100]&&!visit[p/1000*1000+p%100+i*100])        {           q.push(p/1000*1000+p%100+i*100);           ans[p/1000*1000+p%100+i*100]=ans[p]+1;           visit[p/1000*1000+p%100+i*100]=1;         }        if(i!=0&&prime[p%1000+i*1000]&&!visit[p%1000+i*1000])        {            q.push(p%1000+i*1000);            ans[p%1000+i*1000]=ans[p]+1;            visit[p%1000+i*1000]=1;         }     }     if(visit[n]) return ans[n];    }    return -1;} int main(){    int i,j,m,n,t,k;    prime[1]=false;    memset(prime,true,sizeof(prime));    for(i=2;i<=9999/2;i++)    {       if(prime[i])       {         for(j=i<<1;j<=9999;j+=i)         {           prime[j]=false;         }       }    }    cin>>t;    while(t--)    {       cin>>m>>n;       memset(visit,false,sizeof(visit));       k=bfs(m,n);       if(k==-1) cout<<"Impossible"<<endl;       else cout<<k<<endl;    }    return 0;} 


 

 

  

原创粉丝点击