BOJ 1600 :: 말이 되고픈 원숭이
문제 링크 : https://www.acmicpc.net/problem/1600
나의 풀이
>> 방문 여부를 확인하는 배열을 3차원으로 만든다.
// 방문 여부 [x좌표][y좌표][말같이 움직인 횟수]
int visited[201][201][31];
- K만큼 말같이 이동하지 않았으면, 말같이 이동하는 경우를 queue에 갱신시킨다.
- 원숭이가 이동하는 경우를 queue에 갱신시킨다.
- 도착지점에 도달하면 return 한다.
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1600/BOJ_1600.cpp
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 | // 백준알고리즘 1600번 :: 말이 되고픈 원숭이 #include<iostream> #include<queue> using namespace std; int W, H, K, ans; bool flag; int grid[201][201]; // 방문 여부 [x좌표][y좌표][말같이 움직인 횟수] int visited[201][201][31]; queue<pair<pair<int, int>,int>> monkey; // 말의 이동방식 int dh[8][2] = { {-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1} }; // 원숭이의 이동방식 int dm[4][2] = { {0,1}, {0, -1}, {1, 0}, {-1,0} }; void bfs() { while (!monkey.empty()) { int qsz = monkey.size(); while (qsz--) { int x = monkey.front().first.first; int y = monkey.front().first.second; int count = monkey.front().second; monkey.pop(); if (x == H - 1 && y == W - 1) { flag = 1; return; } // K번 보다 적게 말같이 움직였으면, 지금 말같이 움직일 수 있다. if (count < K) { for (int i = 0; i < 8; i++) { int mx = x + dh[i][0]; int my = y + dh[i][1]; int mcount = count + 1; if (mx < 0 || mx >= H || my < 0 || my >= W) continue; if (grid[mx][my] || visited[mx][my][mcount]) continue; visited[mx][my][mcount] = 1; monkey.push(make_pair(make_pair(mx, my), mcount)); } } for (int i = 0; i < 4; i++) { int mx = x + dm[i][0]; int my = y + dm[i][1]; int mcount = count; if (mx < 0 || mx >= H || my < 0 || my >= W) continue; if (grid[mx][my] || visited[mx][my][mcount]) continue; visited[mx][my][mcount] = 1; monkey.push(make_pair(make_pair(mx, my), mcount)); } } ans++; } return; } int main(void) { cin >> K >> W >> H; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { cin >> grid[i][j]; } } visited[0][0][0] = 1; monkey.push(make_pair(make_pair(0, 0), 0)); bfs(); if (flag) cout << ans; else cout << "-1"; return 0; } | cs |
'Problem > BFS' 카테고리의 다른 글
[C/C++] BOJ 2234 :: 성곽 (0) | 2019.02.18 |
---|---|
[C/C++] BOJ 1938 :: 통나무 옮기기 (0) | 2019.02.17 |
[C/C++] BOJ 3055 :: 탈출 (0) | 2019.02.12 |
[C/C++] BOJ 1113 :: 수영장 만들기 (0) | 2019.02.08 |
[C/C++] BOJ 1726 :: 로봇 (0) | 2019.02.07 |