这题比较简单,用一个广搜就行...
要将状态标记是否被访问,不然会超时...
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct num
{
int n,c;
num()
{}
num( int a,int b)
{
n=a; c=b;
}
};
bool prime[10000];
bool vis[10000];
num intil, last;
void bfs()
{
memset( vis,0, sizeof( vis));
int i;
queue<num> que;
que.push( intil);
vis[ intil.n] =1;
while( !que.empty())
{
num tem= que.front();
que.pop();
if( tem.n ==last.n)
{
cout <<tem.c<<endl;
return ;
}
int a,b,c,d;
a= tem.n%10; tem.n/=10;
b= tem.n%10; tem.n/=10;
c= tem.n%10; tem.n/=10;
d= tem.n;
for( i=1; i<10; i+=2)
{
if( i==a)
continue;
int tmp =d*1000+c*100+b*10+i;
if( !prime[tmp] && !vis[tmp])
{
vis[tmp] =1;
num xxx(tmp, tem.c+1);
que.push( xxx);
}
}
for( i=0; i<10; i++)
{
if( i==b)
continue;
int tmp =d*1000+c*100+i*10+a;
if( !prime[tmp] && !vis[tmp])
{
vis[tmp] =1;
num xxx(tmp, tem.c+1);
que.push( xxx);
}
}
for( i=0; i<10; i++)
{
if( i==c)
continue;
int tmp =d*1000+i*100+b*10+a;
if( !prime[tmp] && !vis[tmp])
{
vis[tmp] =1;
num xxx(tmp, tem.c+1);
que.push( xxx);
}
}
for( i=1; i<10; i++)
{
if( i==d)
continue;
int tmp =i*1000+c*100+b*10+a;
if( !prime[tmp] && !vis[tmp])
{
vis[tmp] =1;
num xxx(tmp, tem.c+1);
que.push( xxx);
}
}
}
cout <<"Impossible"<<endl;
}
int main()
{
memset( prime, 0, sizeof( prime));
int i,j;
for( i=2; i<5000; i++)
{
if( !prime[i])
for( j=2; i*j<10000; j++)
prime[ i*j] =1;
}
int t;
cin >>t;
while( t--)
{
cin >>intil.n >>last.n;
intil.c=0;
bfs();
}
return 0;
}