※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |