상세 컨텐츠

본문 제목

2636번: 치즈 - 그래프(BFS)

알고리즘/baekjoon

by oVeron 2023. 4. 1. 14:12

본문

728x90
반응형

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

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 

0. 주어진 판의 왼쪽 끝은 치즈가 없음이 보장되므로, 그 좌표를 시작점으로 정해 bfs 탐색을 진행한다.

1. 지금껏 방문하지 않은 좌표들로 bfs 탐색을 진행하는데, 이때

1-1. 방문한 좌표가 치즈라면, 치즈 좌표를 담은 queue(quCheese)에 따로 저장한다.

1-2. 방문한 좌표가 치즈가 아니라면, 평범하게 탐색에 진행할 때 쓰는 queue(quVis)에 저장한다.

2. quVis가 empty가 될 때까지 탐색을 진행한다. 탐색이 끝났다는 것은 현 상태에서 공기에 접촉한 치즈 좌표를 전부 저장했다는 뜻이다.

3. 공기에 접촉한 치즈 좌표가 없다면 답을 출력한다. 그렇지 않다면 quVis와 quCheese를 swap해 1~2과정을 반복한다.

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tiii;

int R, C;
bool board[101][101];
bool vis[101][101];
int dir[2][4] = {{-1, 1, 0, 0}, {0, 0, -1, 1}};

queue<pii> quVis, quCheese;
int meltTime{0}, leftCheese;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	cin >> R >> C;
	for (int i{1}; i <= R; i++)
	{
		for (int j{1}; j <= C; j++)
		{
			cin >> board[i][j];
		}
	}

	quVis.push({1, 1});
	vis[1][1] = true;

	while (true)
	{
		while (!quVis.empty())
		{
			auto [X, Y] = quVis.front();
			quVis.pop();

			for (int i{0}; i < 4; i++)
			{
				int x = X + dir[0][i], y = Y + dir[1][i];
				if (x >= 1 && x <= R && y >= 1 && y <= C)
				{
					if (vis[x][y])
						continue;

					if (board[x][y])
						quCheese.push({x, y});
					else
						quVis.push({x, y});

					vis[x][y] = true;
				}
			}
		}

		if (quCheese.empty())
		{
			cout << meltTime << "\n"
				 << leftCheese << "\n";
			break;
		}

		meltTime++;
		leftCheese = quCheese.size();
		quVis.swap(quCheese);
	}
}
728x90
반응형

관련글 더보기

댓글 영역