POJ3126
// 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.