zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看