문제
https://www.acmicpc.net/problem/6087
걸린 시간
01 : 04 : 33 실패
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int w, h;
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, -1, 1};
vector<pair<int, int>> C;
vector<vector<char>> Map;
vector<vector<vector<int>>> visited;
struct light{
int y;
int x;
int d; // direction
int m; // mirror
light(int y, int x, int d, int m){
this->y = y;
this->x = x;
this->d = d;
this->m = m;
}
};
int bfs(){
int sy = C[0].first;
int sx = C[0].second;
int ey = C[1].first;
int ex = C[1].second;
visited.resize(4, vector<vector<int>>(h, vector<int>(w, 0)));
queue<light> q;
for(int i = 0; i < 4; i++){
int ny = sy+dy[i];
int nx = sx+dx[i];
if(0 <= ny && ny < h && 0 <= nx && nx < w){
if(Map[ny][nx] != '*'){
visited[i][sy][sx] = 1;
q.push(light(sy, sx, i, 0));
}
}
}
while(!q.empty()){
int y = q.front().y;
int x = q.front().x;
int d = q.front().d;
int m = q.front().m;
q.pop();
int ny = y, nx = x;
while(true){
ny += dy[d];
nx += dx[d];
if(0 > ny || h <= ny || 0 > nx || w <= nx || Map[ny][nx] == '*') break;
if(ny == ey && nx == ex) return m;
for(int i = 0; i < 4; i++){
if(i != d && !visited[i][ny][nx]){
visited[i][ny][nx] = 1;
q.push(light(ny, nx, i, m+1));
}
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> w >> h;
Map.resize(h, vector<char>(w));
for(int y = 0; y < h; y++){
for(int x = 0; x < w; x++){
cin >> Map[y][x];
if(Map[y][x] == 'C')
C.push_back(make_pair(y, x));
}
}
cout << bfs();
return 0;
}
레이저가 진행할 수 있는 방향에 거울을 모두 놓아보는 방법이다. 현재 진행하고 있는 빛이 벽 혹은 목적지에 도달하기 전 거울을 설치해 방향이 바뀐 빛의 경로를 탐색해서는 안된다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 1194번 달이 차오른다, 가자. (0) | 2020.11.02 |
---|---|
Baekjoon 14442번 벽 부수고 이동하기 2 (0) | 2020.11.01 |
Baekjoon 2151번 거울 설치 (0) | 2020.10.30 |
Baekjoon 3197번 백조의 호수 (0) | 2020.10.29 |
Baekjoon 10282번 해킹 (0) | 2020.10.29 |
댓글