-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1963.cpp
More file actions
130 lines (119 loc) · 2.05 KB
/
1963.cpp
File metadata and controls
130 lines (119 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// 1963. 소수 경로
// 2019.05.19
// BFS, 소수
#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
vector<int> prime;
int arr[10000];
int dist[10000];
int visit[10000];
// 테스트케이스들에 대해 초기화 하는 함수
void Init()
{
for(int i=0;i<10000;i++)
{
arr[i]=0;
dist[i]=10000;
visit[i]=0;
}
}
// original에서 한자리만을 바꿔 이동할 수 있는 소수들을 반환하는 함수
vector<int> Find(int original)
{
vector<int> tmp;
for(int i=0;i<prime.size();i++)
{
int a = prime[i];
int originalA = a;
int b = original;
int cnt = 0;
for(int j=0;j<4;j++)
{
int tmpA = a%10;
int tmpB = b%10;
if(tmpA!=tmpB)
{
cnt++;
if(cnt==2)
{
break;
}
}
a/=10;
b/=10;
}
if(cnt==1)
{
tmp.push_back(originalA);
}
}
return tmp;
}
int main()
{
int t;
cin>>t;
// 2부터 9999까지 소수를 구하고 저장
for(int i=2;i<=9999;i++)
{
if(arr[i]==1)
{
continue;
}
for(int j=i+i;j<=9999;j+=i)
{
arr[j]=1;
}
}
for(int i=1000;i<=9999;i++)
{
if(arr[i]==0)
{
prime.push_back(i);
}
}
for(int i=0;i<t;i++)
{
Init();
int a,b;
cin>>a>>b;
// 둘이 같다면 최소횟수 0 출력
if(a==b)
{
cout<<0<<endl;
continue;
}
queue<int> q;
dist[a]=0;
q.push(a);
while(!q.empty())
{
int front = q.front();
q.pop();
for(int i=0;i<Find(front).size();i++)
{
if(visit[Find(front)[i]]==0) // 방문하지 않았다면
{
if(dist[Find(front)[i]]>dist[front]+1) // 거리는 최솟값으로 갱신
{
dist[Find(front)[i]] = dist[front]+1;
}
q.push(Find(front)[i]); // 큐에 넣음
visit[Find(front)[i]] = 1; // 방문
}
}
}
if(dist[b]==10000)
{
cout<<"Impossible"<<endl;
}
else
{
cout<<dist[b]<<endl;
}
}
return 0;
}