poj3126

BFS,因为这题是4位数,所以要判断是不是素数只需要100以下的素数,先生成100以下素数表。

View Code
   
     
#include < iostream >
#include
< cstdlib >
#include
< cstring >
#include
< cstdio >
#include
< queue >
using namespace std;

struct item
{
int num[ 4 ];
} a, b;

int prime[ 100 ], primenum, cost[ 10000 ];

int toint(item & a)
{
int ans = 0 ;
for ( int i = 0 ; i < 4 ; i ++ )
ans
= ans * 10 + a.num[i];
return ans;
}

void makeprime()
{
primenum
= 1 ;
prime[
0 ] = 2 ;
for ( int i = 3 ; i < 100 ; i ++ )
{
bool ok = true ;
for ( int j = 0 ; prime[j] * prime[j] <= i; j ++ )
if (i % prime[j] == 0 )
{
ok
= false ;
break ;
}
if (ok)
{
prime[primenum
++ ] = i;
}
}
}

void init()
{
memset(cost,
- 1 , sizeof (cost));
for ( int i = 0 ; i < 4 ; i ++ )
{
char ch;
scanf(
" %c " , & ch);
a.num[i]
= ch - ' 0 ' ;
}
getchar();
for ( int i = 0 ; i < 4 ; i ++ )
{
char ch;
scanf(
" %c " , & ch);
b.num[i]
= ch - ' 0 ' ;
}
getchar();
}

bool isprime( int a)
{
for ( int i = 0 ; i < primenum && prime[i] * prime[i] <= a; i ++ )
if (a % prime[i] == 0 )
return false ;
return true ;
}

void work()
{
cost[toint(a)]
= 0 ;
queue
< item > q;
q.push(a);
while ( ! q.empty())
{
item temp
= q.front();
int costnow = cost[toint(temp)];
q.pop();
for ( int i = 0 ; i < 4 ; i ++ )
{
int x = temp.num[i];
for ( int j = 0 ; j < 10 ; j ++ )
{
if (i == 0 && j == 0 )
continue ;
if (j == x)
continue ;
temp.num[i]
= j;
int inttemp = toint(temp);
if (cost[inttemp] == - 1 && isprime(inttemp))
{
cost[inttemp]
= costnow + 1 ;
if (inttemp == toint(b))
{
printf(
" %d\n " , cost[inttemp]);
return ;
}
q.push(temp);
}
}
temp.num[i]
= x;
}
}
}

int main()
{
// freopen("D:\\t.txt", "r", stdin);
int t;
makeprime();
scanf(
" %d " , & t);
getchar();
while (t -- )
{
init();
if (toint(a) == toint(b))
printf(
" 0\n " );
work();
}
return 0 ;
}

你可能感兴趣的:(poj)