https://www.acmicpc.net/problem/1697
문제 해결을 위한 과정
이 문제의 경우 일반적인 이차원 배열 형태에서의 bfs와 다른 형태의 문제이지만 원리는 똑같은 문제였습니다.
4방향으로 dx, dy로 방문하는 배열을 3가지 움직임(-1, 1, 좌표*2)를 방문하는 형태로 해결하면 쉽게 해결할 수 있었습니다. 다만, 신경써야할 부분은 시작하자마자 좌표가 같은 경우가 있을 수 있으므로 이것에 대한 예외처리를 해주시면 쉽게 해결할 수 있습니다.
소스코드 - python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from collections import deque
n,k=map(int,input().split())
visited=[0]*100001
q=deque()
q.append(n)
count=0
visited[n]=1
while q:
x=q.popleft()
if x==k:
break
for next in x-1,x+1,x*2:
if next < 0 or next >= 100001:
continue
if not visited[next]:
q.append(next)
visited[next]=visited[x] + 1
print(visited[k]-1)
|
cs |
소스코드 - c++
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
|
#include <bits/stdc++.h>
#define MAX 100001
using namespace std;
int graph[MAX];
int moves[] = { -1, 1, 2 };
void bfs(int n, int k) {
int count = 0;
queue<int> q;
q.push(n);
graph[n] = 1;
if (n == k) {
printf("%d", count);
return;
}
while (!q.empty()) {
int len = q.size();
for (int i = 0; i < len; i++) {
int x = q.front();
q.pop();
for (int i = 0; i < 3; i++) {
int nx;
if (i == 2)
nx = x * moves[2];
else
nx = x + moves[i];
if (nx < 0 || nx >= MAX)
continue;
if (graph[nx] == 0) {
q.push(nx);
graph[nx] = 1;
}
if (nx == k) {
printf("%d", count+1);
return;
}
}
}
count += 1;
}
}
int main(void) {
int n, k;
scanf("%d %d", &n, &k);
bfs(n, k);
return 0;
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
백준 12100번: 2048(Python, cpp) (0) | 2022.02.21 |
---|---|
백준 16236번: 아기상어(Python, cpp) (0) | 2022.02.15 |
백준 알고리즘 11052번: 카드 구매하기(Python) (0) | 2022.02.02 |
백준 알고리즘 9461번: 파도반 수열(Python) (0) | 2022.01.31 |
백준 알고리즘 2193번: 이친수(Python) (0) | 2022.01.31 |