poj3126prime+BFS

题目连接

分析:

这题是在1000-10000之间,从一个素数变换到另一个素数。我们会想到先打印素数表,然后进行搜索。

另外,对素数的变换,我们应进行为的变换。采用queue来存。

代码如下:

#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;

int k,m;
int a[4]={1,10,100,1000};
int visit[10000],prime[10000];

void get_prime()  //素数打表
{
	int i,j;
	for(i=4;i<=10000;i+=2){
	  prime[i]=1;
	}
	int N=(int)sqrt(10000.0);
	for(i=3;i<=N;i+=2){
	 if(!prime[i])
	for(j=i*i;j<10000;j+=2*i)
	  prime[j]=1;
	}
}

int prime_BFS()
 {
	queue<int>Q;
	Q.push(k);  
	visit[k]=0;
    while(!Q.empty())
    {
        int s=Q.front();
        Q.pop();
		if(s==m) return visit[s];
        for(int i=0;i<4;i++)
        { 
         for(int j=0;j<10;j++)
          {
           int x=s/(a[i]*10);    //这个变换不错,参考牛人的代码。 
           int y=s%a[i];
           int num=x*a[i]*10+j*a[i]+y;
           if(num>1000&&visit[num]==-1&&!prime[num])   //num>1000排除了首位为零的。 
            {   
		 	 Q.push(num);
			 visit[num]=visit[s]+1;
            }
          }
        }
	}
   puts("Impossible");
}

 int main()
 {  
	 int n;
     get_prime();
     while(scanf("%d",&n)!=-1)
	   while(n--)
       {
         memset(visit,-1,sizeof(visit));
         scanf("%d%d",&k,&m);     
        // if(!prime[k]&&!prime[m]);
        printf("%d\n",prime_BFS());
        }
    return 0;
}


          
         


原文地址:https://www.cnblogs.com/javawebsoa/p/3099008.html