GitHubSeob

C++ / 백준 / 1261 / 알고스팟 본문

Baekjoon/Gold

C++ / 백준 / 1261 / 알고스팟

GitHubSeob 2021. 10. 12.

문제

https://www.acmicpc.net/problem/1261

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

문제풀이

입력을 받는 matrix벡터와 벽을 몇 번 부쉈는지 나타내는 visit벡터를 선언한다.

BFS로 문제를 풀었으며 queue에는 { y, x, 벽 부순 횟수 } 순으로 입력을 push 했다.

네 방향을 탐색하면서 다음 칸의 visit벡터를 보면서 값이 -1 (방문을 하지 않음)이거나

벽이 있고 cnt+1보다 크면 큐에 push 하고, 벽이 없고 cnt보다 크면 방문한다.

모든 탐색이 끝나 큐가 비었으면 BFS함수를 종료하고 visit[N][M]을 출력하면 된다.

N과 M은 1 이상이므로 1, 1 일수도 있다. 이 경우 문제에 나왔듯이 항상 뚫려있으므로 0을 출력하면 된다.

 

 

코드

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int N, M;
vector<vector<int>>matrix;
vector<vector<int>>visit;
vector<int> dx = { -1, 1, 0, 0 };
vector<int> dy = { 0, 0, 1, -1 };

void BFS() {
	queue<vector<int>>q;
	q.push({ 1,1,0 });
	while (!q.empty()) {
		int y = q.front()[0];
		int x = q.front()[1];
		int cnt = q.front()[2];
		q.pop();
		for (int idx = 0; idx < 4; ++idx) {
			int n_y = y + dy[idx];
			int n_x = x + dx[idx];
			if (n_y >= 1 && n_y <= N && n_x >= 1 && n_x <= M) {
				if (matrix[n_y][n_x] == 0) {
					if (visit[n_y][n_x] > cnt || visit[n_y][n_x] == -1) {
						visit[n_y][n_x] = cnt;
						q.push({ n_y,n_x,cnt });
					}
				}
				else {
					if (visit[n_y][n_x] > cnt + 1 || visit[n_y][n_x] == -1) {
						visit[n_y][n_x] = cnt + 1;
						q.push({ n_y, n_x, cnt + 1 });
					}
				}
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	string number = "";
	int y = 0, x = 0;
	cin >> M >> N;

	matrix = vector<vector<int>>(N + 1, vector<int>(M + 1, 0));
	visit = vector<vector<int>>(N + 1, vector<int>(M + 1, -1));

	for (y = 1; y <= N; ++y) {
		cin >> number;
		for (x = 1; x <= M; ++x)
			matrix[y][x] = number[x - 1] - '0';
	}

	BFS();

	if (visit[N][M] == -1) visit[N][M] = 0;
	cout << visit[N][M];
}

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 2143 / 두 배열의 합  (0) 2021.10.15
C++ / 백준 / 2632 / 피자판매  (0) 2021.10.15
C++ / 백준 / 1644 / 소수의 연속합  (0) 2021.10.07
C++ / 백준 / 1806 / 부분합  (0) 2021.10.07
C++ / 백준 / 1987 / 알파벳  (0) 2021.09.30