λμ΄λ : ?
κ±Έλ¦° μκ° : 1μκ° λ°
λ¬Έμ
λλ¬Όμμμ λ§ νμΆν μμμ΄ ν λ§λ¦¬κ° μΈμꡬ경μ νκ³ μλ€. κ·Έ λ μμ λ§(Horse)μ΄ λκΈ°λ₯Ό κ°μ ν μνλ€. κ·Έλμ κ·Έλ λ§μ μμ§μμ μ μ¬ν μ΄ν΄λ³΄κ³ κ·Έλλ‘ λ°λΌ νκΈ°λ‘ νμλ€. λ§μ λ§μ΄λ€. λ§μ 격μνμμ 체μ€μ λμ΄νΈμ κ°μ μ΄λλ°©μμ κ°μ§λ€. λ€μ κ·Έλ¦Όμ λ§μ μ΄λλ°©λ²μ΄ λνλμλ€. xνμν κ³³μΌλ‘ λ§μ΄ κ° μ μλ€λ λ»μ΄λ€. μ°Έκ³ λ‘ λ§μ μ₯μ λ¬Όμ λ°μ΄λμ μ μλ€.
x | x | |||
---|---|---|---|---|
x | x | |||
λ§ | ||||
x | x | |||
x | x |
κ·Όλ° μμμ΄λ ν κ°μ§ μ°©κ°νκ³ μλ κ²μ΄ μλ€. λ§μ μ λ κ² μμ§μΌ μ μμ§λ§ μμμ΄λ λ₯λ ₯μ΄ λΆμ‘±ν΄μ μ΄ Kλ²λ§ μμ κ°μ΄ μμ§μΌ μ μκ³ , κ·Έ μΈμλ κ·Έλ₯ μΈμ ν μΉΈμΌλ‘λ§ μμ§μΌ μ μλ€. λκ°μ λ°©ν₯μ μΈμ ν μΉΈμ ν¬ν¨λμ§ μλλ€.
μ΄μ μμμ΄λ λ¨Έλλ¨Ό μ¬νκΈΈμ λ λλ€. 격μνμ 맨 μΌμͺ½ μμμ μμν΄μ 맨 μ€λ₯Έμͺ½ μλκΉμ§ κ°μΌνλ€. μΈμ ν λ€ λ°©ν₯μΌλ‘ ν λ² μμ§μ΄λ κ², λ§μ μμ§μμΌλ‘ ν λ² μμ§μ΄λ κ², λͺ¨λ ν λ²μ λμμΌλ‘ μΉλ€. 격μνμ΄ μ£Όμ΄μ‘μ λ, μμμ΄κ° μ΅μνμ λμμΌλ‘ μμμ§μ μμ λμ°©μ§μ κΉμ§ κ° μ μλ λ°©λ²μ μμλ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
νμ΄
- μ΅λ¨ κ²½λ‘ λ¬Έμ μ΄λ―λ‘ bfs
- κ²½λ‘κ° μμ μλ μμ μ£Όμ
μ½λ
#include <iostream>
#include <queue>
using namespace std;
struct Node {
int r, c, k, path;
Node(int row, int col, int num, int p) {
r = row; c = col; k = num; path = p;
}
};
int direction[4][2] = { {0,1}, {1,0}, {0, -1}, {-1, 0} };
int horseDirection[8][2] = { {1,2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2} };
int map[201][201];
int memo[201][201][31]; // λ©λͺ¨μ΄μ μ΄μ
=> visited λ°°μ΄
int main() {
// 10μ 10λΆ μμ
// λ§μ μμ§μμΌλ‘ kλ², λλ¨Έμ§λ μΈμ ν μΉΈ
// 0 : νμ§, 1: μ₯μ λ¬Ό
// kλ 30μ΄ν
// μμΌλ‘ 2 μμΌλ‘ 1
// bfs (ν΄λΉ μμΉμμ kλ₯Ό μΌλμ§ μμΌλμ§ λ©λͺ¨μ΄μ μ΄μ
)
// (r,c,k)
int K; cin >> K;
int W, H; cin >> W >> H;
fill(&map[0][0], &map[200][201], -1);
fill(&memo[0][0][0], &memo[200][200][30], -1);
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cin >> map[i][j];
}
}
int result = 1e8;
queue<Node*> que;
que.push(new Node(0, 0, K, 0));
while (!que.empty()) {
Node* pos = que.front(); que.pop();
int path = pos->path + 1; // λ£μ§ μκ³ time μ μλ³μλ‘ μ¬μ©νλ©΄ λ¨
if (pos->r == H - 1 && pos->c == W - 1) {
// λ§μ§λ§μ λμ°©
result = result > path - 1 ? path - 1 : result;
break;
}
for (int i = 0; i < 4; i++) {
int r = pos->r + direction[i][0];
int c = pos->c + direction[i][1];
if (r<0 || c<0 || r>=H || c>=W) // 맡 λ°μ μμΉ
continue;
if (map[r][c] == 1) // μ₯μ λ¬Όμ΄ μμ
continue;
if (memo[r][c][pos->k] != -1) // μ΄λ―Έ λ€λ¦ => μ¬μ€ k μ΄νμ λͺ¨λ memoκ° μμΌλ©΄ μν΄λ λ¨
continue;
que.push(new Node(r, c, pos->k, path));
memo[r][c][pos->k] = 0;
}
if (pos->k == 0)
continue;
for (int i = 0; i < 8; i++) {
int r = pos->r + horseDirection[i][0];
int c = pos->c + horseDirection[i][1];
if (r < 0 || c < 0 || r >= H || c >= W) // 맡 λ°μ μμΉ
continue;
if (map[r][c] == 1) // μ₯μ λ¬Όμ΄ μμ
continue;
if (memo[r][c][pos->k-1] != -1) // μ΄λ―Έ λ€λ¦ => λ£μ λ 체ν¬ν΄μ€μΌ λ©λͺ¨λ¦¬ μ΄κ³Ό x
continue;
que.push(new Node(r, c, pos->k-1, path)); // K μ¬μ©
memo[r][c][pos->k-1] = 0;
}
}
if (result == 1e8) {
result = -1;
}
cout << result;
}
μ£Όμν μ
- bfs μ time λ³μλ₯Ό μ μμΌλ‘ μ¬μ©νμ¬ 1μ© μ¦κ°μν€λ λ°©μμΌλ‘ νλ κ²μ΄ Node structμ λ£λ κ²λ³΄λ€ νΈνλ€.
- μ΅μ’ κ²°κ³Όλ₯Ό λ§μ‘±νμ λμλ μ΅λ¨ κ²½λ‘μ΄λ―λ‘ κ·Έλ₯ break
κ²°κ³Ό
μμ΄λ | λ©λͺ¨λ¦¬ | μκ° | μΈμ΄ | μ½λ κΈΈμ΄ |
---|---|---|---|---|
gmldms784 | 45488 | 144 | C++17 / μμ | 2270 |
'Algorithm λ¬Έμ > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[c++] BOJ 3584 :: κ°μ₯ κ°κΉμ΄ κ³΅ν΅ μ‘°μ (0) | 2021.07.03 |
---|---|
[c++] BOJ 5052 :: μ νλ²νΈ λͺ©λ‘ (0) | 2021.07.03 |
[c++] BOJ 1194 :: λ¬μ΄ μ°¨μ€λ₯Έλ€ κ°μ (0) | 2021.06.02 |
[c++] BOJ 2250 :: νΈλ¦¬μ λμ΄μ λλΉ (0) | 2021.06.02 |
[c++] BOJ 1525 :: νΌμ¦ (0) | 2021.05.26 |
Comment