※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24449번 문제인 カーペット (Carpet)이다.
문제는 아래 링크를 확인하자.

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

 

24449번: カーペット (Carpet)

オシャレ好きのビ太郎は,カーペットを新調した.カーペットは縦 H 行,横 W 列のマス目状に区切られた長方形の形をしており,各マスは白か黒のいずれかの色で塗られている.カーペッ

www.acmicpc.net

주어진 카펫을 각 칸을 노드로 가지고, 변이 맞닿아있으면서 색이 서로 다른 칸 사이에 에지가 있는 그래프로 생각하자.

 

이 때, 좌상단의 칸에서 우하단의 칸까지의 최단경로는 위 그래프에서 BFS를 돌려보는 것으로 구할 수 있다.

 

좌상단의 칸에서 우하단까지 도달할 수 없는 경우 -1을 출력해주자.

 

아래는 제출한 소스코드이다.

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

int R, C;
string board[500];
int dist[500][500];
bool visited[500][500];
int dr[4] = { 1,0,-1,0 };
int dc[4] = { 0,1,0,-1 };

void bfs() {
	dist[0][0] = 1;
	queue<pair<int, int>> que;
	que.push(make_pair(0, 0));
	visited[0][0] = 1;

	while (!que.empty()) {
		int r = que.front().first, c = que.front().second; que.pop();
		for (int i = 0; i < 4; i++) {
			int rr = r + dr[i], cc = c + dc[i];
			if (-1 < rr && rr < R && -1 < cc && cc < C) {
				if (board[r][c] == board[rr][cc] || visited[rr][cc]) continue;
				visited[rr][cc] = 1;
				dist[rr][cc] = dist[r][c] + 1;
				que.push(make_pair(rr, cc));
			}
		}
	}
}

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

	cin >> R >> C;
	for (int r = 0; r < R; r++) cin >> board[r];

	bfs();

	cout << dist[R - 1][C - 1] - 1 << '\n';
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2773 // C++] 바깥 삼각형의 중심  (0) 2022.12.18
[BOJ 26264 // C++] 빅데이터? 정보보호!  (0) 2022.12.18
[BOJ 5341 // C++] Pyramids  (0) 2022.12.18
[BOJ 10189 // C++] Hook  (0) 2022.12.18
[BOJ 2757 // C++] 엑셀  (0) 2022.12.17

+ Recent posts