-
백준(BOJ) 2151번 거울 설치알고리즘 풀이/백준(Boj) 2019. 10. 22. 02:22
문제 : https://www.acmicpc.net/problem/2151
2151번: 거울 설치
첫째 줄에 집의 크기 N (1 ≤ N ≤ 50)이 주어진다. 다음 N개의 줄에는 N개의 문자로 집에 대한 정보가 주어진다. ‘#’는 문이 설치된 곳으로 항상 두 곳이며, ‘.’은 아무 것도 없는 것으로 빛은 이 곳을 통과한다. ‘!’은 거울을 설치할 수 있는 위치를 나타내고, ‘*’은 빛이 통과할 수 없는 벽을 나타낸다.
www.acmicpc.net
풀이 :
#와 !을 정점으로 하고 상하좌우로 거울이나 문이 만날수 있다면 간선을 이어주자.
그 후 처음 #에서 마지막 #으로 가는 최단거리 d를 구하자. 이는 BFS를 이용해서 풀어주자.
ex) 예제
코드 ( C++ )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <string> #include <vector> #include <queue> using namespace std; int N; string s[50]; const int dy[4] = { 1,-1,0,0 }; const int dx[4] = { 0, 0, 1, -1 }; int main() { int start = -1, end = -1; vector<pair<int, int>> v; cin >> N; vector<vector<int>> temp(N, vector<int>(N, 0)); int num = 0; for (int i = 0; i < N; ++i) { cin >> s[i]; for (int j = 0; j < N; ++j) { if (s[i][j] == '#') { v.push_back({ i,j }); if (start == -1) { start = num; } else { end = num; } temp[i][j] = num; num++; } if (s[i][j] == '!') { v.push_back({ i,j }); temp[i][j] = num; num++; } } } // 그래프 간선구하기 vector<vector<bool>> adj(num, vector<bool>(num, 0)); for (int i = 0; i < v.size(); ++i) { int y = v[i].first; int x = v[i].second; for (int j = 0; j < 4; ++j) { int ny = y + dy[j]; int nx = x + dx[j]; while (0 <= ny && ny < N && 0 <= nx && nx < N) { if (s[ny][nx] == '*') break; // adj에 넣기 if (s[ny][nx] == '!' || s[ny][nx] == '#') { adj[i][temp[ny][nx]] = 1; } ny += dy[j]; nx += dx[j]; } } } vector<int> d(num, - 1); queue<int> q; q.push(start); d[start] = 0; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = 0; i < num; ++i) { bool there = adj[x][i]; if (there && d[i] == -1) { q.push(i); d[i] = d[x] + 1; } } } cout << d[end] - 1 << "\n"; return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 2169번 로봇 조종하기 (3) 2019.10.27 백준(BOJ) 14225번 부분수열의 합 (31) 2019.10.25 백준(BOJ) 2422번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (31) 2019.10.18 백준(BOJ) 4연산 (31) 2019.10.16 백준(BOJ) 9944번 NxM 보드 완주하기 (0) 2019.10.13