SDJ( 수돈재 아님 ㅎ )

[C++] 1963 - 소수 경로 본문

알고리즘/Backjoon

[C++] 1963 - 소수 경로

ShinDongJun 2020. 2. 1. 08:32

문제 링크 : https://www.acmicpc.net/problem/1963

 

1963번: 소수 경로

문제 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금은 1033으로 해놨는데... 다음 소수를 무엇으로 할지 고민중이야" “그럼 8179로 해” “흠... 생각 좀 해볼게. 이 게임은 좀 이상해서 비밀번호를 한 번에 한 자리 밖에 못 바꾼단 말이야. 예를 들어 내가 첫 자리만 바꾸면 8033이 되니까 소수가 아니잖아.

www.acmicpc.net

 

 

 

 

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
#include<bits/stdc++.h>
 
#define endl '\n'
 
using namespace std;
 
typedef struct Data
{
    int prime;
    int count;    
}Data;
 
int E[10005];
bool visited[10005];
 
void init()
{
    E[1= 1;
    for(int i = 2; i*<= 10000++i)
    {
        for(int j = i*i; j <= 10000; j+=i)
        {
            E[j] = 1;
        }
    }
}
 
int BFS(int start, int end)
{
    Data p;
    queue<Data> q;
    q.push({start, 0});
 
    while(!q.empty())
    {
        p = q.front();
        q.pop();
 
        if(p.prime == end)
            return p.count;
 
        for(int i = 1; i <= 9++i)
        {
            int tmp = i*1000+p.prime%1000;
            if(E[tmp] == 0 && visited[tmp] == 0)
            {
                visited[tmp] = 1;
                q.push({tmp, p.count+1});
            }
        }
 
        for(int i = 0; i <= 9++i)
        {
            int tmp = (p.prime/1000)*1000 + i*100 + p.prime%100;
            if(E[tmp] == 0 && visited[tmp] == 0)
            {
                visited[tmp] = 1;
                q.push({tmp, p.count+1});
            }
 
            tmp = (p.prime/100)*100 + i*10 + p.prime%10;
            if(E[tmp] == 0 && visited[tmp] == 0)
            {
                visited[tmp] = 1;
                q.push({tmp, p.count+1});
            }
 
            tmp = (p.prime/10)*10 + i;
            if(E[tmp] == 0 && visited[tmp] == 0)
            {
                visited[tmp] = 1;
                q.push({tmp, p.count+1});
            }
        }
 
    }
 
    return -1;
}
 
int main(void)
{
    init();
 
    int t;
    scanf("%d"&t);
 
    while(t--)
    {
        int a, b;
        scanf("%d %d"&a, &b);
        printf("%d\n", BFS(a, b));
        memset(visited, 0sizeof(visited));
    }
 
    return 0;
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[C++] 1806 - 부분합  (0) 2020.02.01
[C++] 2589 - 보물섬  (0) 2020.02.01
[C++] 11881 - 지우개  (0) 2020.02.01
[C++] 2166 - 다각형의 면적  (0) 2020.01.30
[C++] 1759 - 암호 만들기  (0) 2020.01.30
Comments