//代码1:376K 204ms
#include <iostream>
#include <queue>
using namespace std;
#define SIZE 10000
int prim[SIZE];
int dist[SIZE];
int visit[SIZE];
int primSize;
void prime()
{
int i,j;
bool mark = false;
int temp[SIZE];
memset(temp, 0,sizeof(temp));
primSize = 0;
for ( i = 2; i < SIZE; i++ )
{
if ( !temp[i] ){
for ( j = 2; j*i < SIZE; j++ )
temp[j*i] = -1;
if ( i > 1000 )
prim[++primSize] = i;
}
}
}
bool isAdjacent( int curr, int next )
{
int change = 0;
if ( curr%10 == next%10 ) change++;
if ( (curr/10)%10 == (next/10)%10 ) change++;
if ( (curr/100)%10 == (next/100)%10 ) change++;
if ( curr/1000 == next/1000 ) change++;
return change == 3;
}
int bfs( int start, int end )
{
queue<int> Q;
int i,v;
bool isFind = false;
memset(visit,0,sizeof(visit));
memset(dist,0,sizeof(dist));
dist[start] = 0;
visit[start] = 1;
Q.push(start);
while( !Q.empty() )
{
v = Q.front();
Q.pop();
for (i = 1; i <= primSize && !isFind; i++ )
{
if( !visit[prim[i]] )
{
if ( isAdjacent(prim[i], v) )
{
dist[prim[i]] = dist[v] + 1;
visit[prim[i]] = 1;
Q.push(prim[i]);
if ( prim[i] == end )
isFind = true;
}
}
}
}
if ( !dist[end] )
return -1;
else return dist[end];
}
int main()
{
int n,first,second,ans;
prime();
cin >> n;
while( n-- )
{
cin >> first >> second;
if ( first == second ) {
cout << "0" << endl;
continue;
}
ans = bfs( first, second );
if ( ans < 0 ) cout << "Impossible" << endl;
else cout << ans << endl;
}
return 0;
}
//代码2:344K 32ms
#include <iostream>
#include <queue>
using namespace std;
#define SIZE 10000
int prim[SIZE];
int dist[SIZE];
bool visit[SIZE];
void prime()
{
int i,j;
memset(prim,0,sizeof(prim));
for ( i = 2; i < SIZE; i++ )
{
if ( !prim[i] ){
for ( j = 2; j*i < SIZE; j++ )
prim[j*i] = 1;
}
}
}
int bfs( int start, int end )
{
queue<int> Q;
int i,j,v,temp;
bool isFind = false;
memset(visit,false,sizeof(visit));
memset(dist,0,sizeof(dist));
dist[start] = 0;
visit[start] = true;
Q.push(start);
while( !Q.empty() )
{
v = Q.front();
Q.pop();
char curr[4]; sprintf(curr,"%d",v);
for ( i = 0; i < 4 && !isFind; i++ )
{
for ( j = 0; j < 10 && !isFind; j++ )
{
if ( !i && !j ) continue;
else if ( i == 0 )
temp = 1000*j+100*(curr[1]-'0')+10*(curr[2]-'0')+(curr[3]-'0');
else if ( i == 1 )
temp = 1000*(curr[0]-'0')+100*j+10*(curr[2]-'0')+(curr[3]-'0');
else if ( i == 2 )
temp = 1000*(curr[0]-'0')+100*(curr[1]-'0')+10*j+(curr[3]-'0');
else
temp = 1000*(curr[0]-'0')+100*(curr[1]-'0')+10*(curr[2]-'0')+j;
if ( !visit[temp] && !prim[temp] )
{
dist[temp] = dist[v] + 1;
visit[temp] = true;
Q.push(temp);
if ( temp == end )
isFind = true;
}
}
}
}
if ( !dist[end] )
return -1;
else return dist[end];
}
int main()
{
int n,first,second,ans;
prime();
cin >> n;
while( n-- )
{
cin >> first >> second;
if ( first == second ) {
cout << "0" << endl;
continue;
}
ans = bfs( first, second );
if ( ans < 0 ) cout << "Impossible" << endl;
else cout << ans << endl;
}
return 0;
}
POJ3126
最新推荐文章于 2023-08-12 18:22:10 发布