문제 출처 : https://www.acmicpc.net/problem/9019
이번 문제는 BFS를 이용하여 해결하는 문제이다.
기본적인 BFS 기법을 이용하여 해결하는 문제이지만 구조체에 char 배열을 선언해서 저장하는 형식으로
풀어보았더니 타임 에러가 나오게 되었다.
그리고 숫자가 -1 될 때 0 일때 9999가 되는 것이 아니고 -1 일때 9999가 되는 것이므로
런타임 에러도 조심해야 한다.
그래서 check 배열로 타고 가는 것을 역추적하는 방식으로 타임 에러를 해결 할 수 있었다.
아래는 해당 문제를 풀이한 소스 코드이다.
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
131
132
133
134
135
136
137
138
139
140
|
#include<stdio.h>
#include<queue>
#pragma warning(disable:4996)
using namespace std;
int start, finish;
int visit[10001];
int check[10001];
int dir[10001];
char arr[10001];
struct list
{
int num;
int cnt = 0;
};
queue <list> que;
// D 2배 S n-1 L 왼편으로 이동 R 우측으로 이동
int D(int num)
{
int n = 2 * num;
if (n > 9999)
n = n % 10000;
return n;
}
int S(int num)
{
int n = num - 1;
if (n == -1)
n = 9999;
return n;
}
int L(int num)
{
int n = num / 1000;
int temp = (num % 1000) * 10;
return temp+n;
}
int R(int num)
{
int n = num % 10;
int temp = num / 10;
return 1000 * n + temp;
}
void BFS()
{
{
list temp = que.front();
que.pop();
int num;
{
int i = 0;
int x = finish;
while (1)
{
if (x == start)
break;
if (dir[x] == 1)
arr[i] = 'D';
else if (dir[x] == 2)
arr[i] = 'S';
else if (dir[x] == 3)
arr[i] = 'L';
else
arr[i] = 'R';
x = check[x];
i++;
}
{
printf("%c", arr[i]);
}
printf("\n");
return;
}
list A = temp;
num = D(temp.num);
if (visit[num] == 0)
{
visit[num]=1;
check[num] = temp.num;
dir[num] = 1;
A.num = num;
}
num = S(temp.num);
if (visit[num] == 0)
{
visit[num]=1;
check[num] = temp.num;
dir[num] = 2;
A.num = num;
}
num = L(temp.num);
if (visit[num] == 0)
{
check[num] = temp.num;
dir[num] = 3;
visit[num]=1;
A.num = num;
}
num = R(temp.num);
if (visit[num] == 0)
{
check[num] = temp.num;
dir[num] = 4;
visit[num]=1;
A.num = num;
}
}
}
void reset()
{
for (int i = 0; i <= 10000; i++)
visit[i] = 0;
que.pop();
}
int main()
{
int Test;
scanf("%d", &Test);
for (int i = 0; i < Test; i++)
{
scanf("%d %d", &start, &finish);
list temp;
temp.num = start;
visit[start] = 1;
BFS();
reset();
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘' 카테고리의 다른 글
백준 3079번 문제 ( 입국 심사 ) (0) | 2020.02.26 |
---|---|
백준 16397번 문제 ( 탈출 ) (0) | 2020.02.18 |
백준 7569번 문제 ( 토마토 ) (0) | 2020.02.18 |
백준 6593번 문제 ( 상범 빌딩 ) (0) | 2020.02.18 |
백준 5427번 문제 ( 불 ) (0) | 2020.02.18 |