-
[14442] 벽 부수고 이동하기 2BOJ 2021. 9. 9. 14:33
https://www.acmicpc.net/problem/14442
14442번: 벽 부수고 이동하기 2
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.
www.acmicpc.net
<문제>
이전의 '벽 부수고 이동하기' 문제와 유사하다.
[2206] 벽 부수고 이동하기 :: Dizlet-Algorithm (tistory.com)
[2206] 벽 부수고 이동하기
https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에
dizlet.tistory.com
위 내용대로 구현했다면 벽을 부수는 횟수를 1회에서 k회로 확장하는건 어렵지 않다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include<stdio.h>#include<string.h>#include<queue>using namespace std;typedef struct { int y, x, cnt, dist; } state;queue <state>q;int n, m, k, map[1001][1001];bool visit[1001][1001][11];int dy[4] = { 0,1,0,-1 }, dx[4] = { 1,0,-1,0 };int f(void) {while (!q.empty())q.pop();memset(visit, false, sizeof(visit));q.push({ 0,0,0,1 });visit[0][0][0] = true;int y, x, i;while (!q.empty()) {state cur = q.front();q.pop();for (i = 0; i < 4; i++) {y = cur.y + dy[i];x = cur.x + dx[i];if (y == n - 1 && x == m - 1) {return cur.dist + 1;}if (y < 0 || x < 0 || y >= n || x >= m)continue;if (map[y][x] == 0 && visit[y][x][cur.cnt] == false) {visit[y][x][cur.cnt] = true;q.push({ y,x,cur.cnt,cur.dist + 1 });}if (map[y][x] == 1 && cur.cnt < k && visit[y][x][cur.cnt + 1] == false) {visit[y][x][cur.cnt + 1] = true;q.push({ y,x,cur.cnt + 1,cur.dist + 1 });}}}return -1;}int main(void) {scanf("%d %d %d", &n, &m, &k);if (n == 1 && m == 1) {printf("1");return 0;}int i, j;char s[1010] = { 0 };for (i = 0; i < n; i++) {scanf("%s", s);for (j = 0; s[j]; j++) {if (s[j] == '0')map[i][j] = 0;else if (s[j] == '1')map[i][j] = 1;}}printf("%d", f());return 0;}cs 'BOJ' 카테고리의 다른 글
[16236] 아기 상어 (0) 2021.09.09 [16933] 벽 부수고 이동하기 3 (0) 2021.09.09 [17779] 게리맨더링 2 (0) 2021.09.09 [1013] Contact (0) 2021.09.07 [8980] 택배 (0) 2021.09.05