pku poj 3126

pku poj 3126
筛个素数表+BFS
貌似数据里没有impossible的情况
#include < iostream >
using   namespace  std;
#define  M 10000
bool  prime[M];
bool  visit[M];
int  s,e;
int  step;
void  crearprimetable() // 筛素数表
{
       
int i,j;
       
//prime[0]=prime[1]=1;
       for(i=2;i<M;i++)      //判断i是不是素数
           if(prime[i]==0)        //
               for(j=i+i;j<M;j+=i) //把是i倍数的数j记上1,不是素数.
                   prime[j]=1;

}


void  bfs()
{
    
int i,j,k,num,t;
    
int que[10000];
    
int front,rear,trear;
    step
=0;
    
if(s==e) return ;
    front
=rear=0;
    que[rear
++]=s;
    
while(front<rear)
    
{
        step
++;
        trear
=rear;
        
while(front<trear)
        
{
            num
=que[front++];
            
for(i=1;i<10;i++)//换个位
            {
                t
=num/10*10+i;
                
if(!prime[t] && !visit[t])
                    
if(t==e) return ;
                    
else  {que[rear++]=t;visit[t]=true;}
            }

            
for(i=0;i<10;i++)//换十位
            {
                t
=num/100*100+i*10+num%10;
                
if(!prime[t] && !visit[t])
                    
if(t==e) return ;
                    
else  {que[rear++]=t;visit[t]=true;}
            }

            
for(i=0;i<10;i++)//换百位
            {
                t
=num/1000*1000+i*100+num%100;
                
if(!prime[t] && !visit[t])
                    
if(t==e) return ;
                    
else  {que[rear++]=t;visit[t]=true;}
            }

            
for(i=1;i<10;i++)//换百位
            {
                t
=i*1000+num%1000;
                
if(!prime[t] && !visit[t])
                    
if(t==e) return ;
                    
else  {que[rear++]=t;visit[t]=true;}
            }

        }

    }


}

int  main()
{
    
int n;
    crearprimetable();
    scanf(
"%d",&n);
    
while(n--)
    
{
        scanf(
"%d%d",&s,&e);
        memset(visit,
0,sizeof(visit));
        bfs();
        printf(
"%d\n",step);
    }

    
return 0;
}

你可能感兴趣的:(pku poj 3126)