#include <iostream> #include <queue> #include <deque> #include <stack> #include <map> #include <string> #include <string.h> #include <math.h> #include <vector> #include <algorithm> using namespace std; typedef struct node { int x; int y; int cnt; int time; }node; int row, col, K; int Map[1010][1010]; int visited[1010][1010][12][2]; int Min = 99999999; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; int safe(int x, int y) { if(1 <= x && x <= row && 1 <= y && y <= col) { return 1; } return 0; } void BFS() { queue<node> q; q.push({1, 1, 0, 0}); visited[1][1][0][0] = 1; while(!q.empty()) { int x = q.front().x; int y = q.front().y; int cnt = q.front().cnt; int time = q.front().time; q.pop(); if(x == row && y == col) { Min = visited[x][y][cnt][time]; return; } for(int i = 0; i < 4; i++) { int nx = x+dx[i]; int ny = y+dy[i]; if(safe(nx, ny) == 0) { continue; } if(time == 0) { // 이동하지 않고 같은 칸에 머무르는 경우에도 낮과 밤이 바뀌게 된다. if(visited[x][y][cnt][1] == 0) { q.push({x, y, cnt, 1}); visited[x][y][cnt][1] = visited[x][y][cnt][0] + 1; } if(Map[nx][ny] == 0 && visited[nx][ny][cnt][1] == 0) { q.push({nx, ny, cnt, 1}); visited[nx][ny][cnt][1] = visited[x][y][cnt][0] + 1; } else if(Map[nx][ny] == 1 && visited[nx][ny][cnt+1][1] == 0 && cnt+1 <= K) { q.push({nx, ny, cnt+1, 1}); visited[nx][ny][cnt+1][1] = visited[x][y][cnt][0] + 1; } } else if(time == 1) { // 이동하지 않고 같은 칸에 머무르는 경우에도 낮과 밤이 바뀌게 된다. if(visited[x][y][cnt][0] == 0) { q.push({x, y, cnt, 0}); visited[x][y][cnt][0] = visited[x][y][cnt][1] + 1; } if(Map[nx][ny] == 0 && visited[nx][ny][cnt][0] == 0) { q.push({nx, ny, cnt, 0}); visited[nx][ny][cnt][0] = visited[x][y][cnt][1] + 1; } } } } } int main(void) { // freopen("B14442_input.txt", "r", stdin); cin >> row >> col >> K; for(int i = 1; i <= row; i++) { for(int j = 1; j <= col; j++) { scanf("%1d", &Map[i][j]); } } BFS(); if(Min == 99999999) { cout << "-1"; } else { cout << Min; } return 0; } | cs |
'Baekjoon > BFS' 카테고리의 다른 글
[백준 17471] 게리맨더링 (DFS) (C/C+) (★) (0) | 2021.01.17 |
---|---|
[백준 5213] 과외맨 (BFS) (C/C++) (★★) (0) | 2020.05.26 |
[백준 1939] 중량제한 (BFS, BinarySearch) (C/C++) (★★★) (0) | 2020.05.24 |
[백준 4991] 로봇 청소기 (BFS, Bitmask) (C/C++) (★★★) (0) | 2020.05.21 |
[백준 2638] 치즈 (BFS) (C/C++) (★★★) (0) | 2020.04.07 |