您的位置:首页 > 其它

poj 3126 Prime Path

2012-07-14 10:06 393 查看
一道素数与BFS结合的题;

View Code

View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<vector>
using namespace std;
class que
{
public:
int num;
int step;
}q[20000];
bool hash[10000];

void Prime( )
{
int t = ( int )sqrt( 9999.0 ) + 1;
memset( hash , 0 ,sizeof( hash ) );
for(int i = 2 ; i <= t ; i ++ )
{
if( !hash[i] )
{
for( int j = 2; i*j <=  9999 ; j ++ )
{
hash[j*i] = true;
}
}
}
}
int opt( int num , int n )
{
//    printf("%d\n",num );

return 0;
}
int BFS( int num1, int num2 )
{
bool visit[10000]={0};
if( num1 == num2 ) return 0;
int E=0,S=0;
q[E].step = 0;
q[E++].num = num1;
while( E > S )
{
//        printf( "%d\n",q[S].num );
//        getchar();
for( int i = 0 ; i < 4 ;i ++ )
{
int sum = 1,t;
for( int j = 0; j < i; j ++ )
{
sum *= 10;
}
int t1 = q[S].num%sum;
int t2 = (q[S].num/(sum*10));
t2 *=(sum*10) ;
for( int j = 0 ; j <= 9 ; j ++ )
{
t = sum*j;
int num = t + t1 + t2;
if( num >= 1000 && num <=9999 && !hash[num] && !visit[num] )
{
if( num == num2 ) return q[S].step + 1;
visit[num] = true;
q[E].num = num;
q[E++].step = q[S].step + 1;
}
}
}
S ++;
}
}
int main(  )
{
Prime();
int n,num1,num2;
while( scanf( "%d",&n )==1 )
{
while( n-- )
{
scanf( "%d %d",&num1,&num2 );
printf( "%d\n",BFS( num1 ,num2 ) );
}
}
//system( "pause" );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: