https://www.acmicpc.net/problem/6087
- 빛이 이동하면서 꺾이는 횟수를 저장하면서 BFS 탐색을 해도 될 것이고, 아래 코드처럼 선분 갯수를 카운트해서 1을 빼주면 거울 갯수가 된다.
- 상하좌우로 빛이 이동하는 구간을 while문으로 표현할 수 있다는 점이 일반적인 bfs문제들과는 달라서 기록해둔다. bfs 탐색시 예외케이스를 continue문으로 빼버리는 템플릿에 익숙해지다보니 좀 햇깔렸다.
- 지도의 크기를 W*H로 표현해서 이를 배열로 선언하면 char a[h][w]로 선언해야된다. int map[행][열] 임을 계속 기억해두자.
#include <cstring>
#include <iostream>
#include <queue>
#include <tuple>
#include <vector>
using namespace std;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int m, n, sx, sy, ex, ey;
string a[100];
int dist[100][100]; // 선분 갯수
vector<pair<int, int>> loc;
void bfs() {
memset(dist, -1, sizeof(dist));
tie(sx, sy) = loc[0];
tie(ex, ey) = loc[1];
queue<pair<int, int>> q;
q.push({sx, sy});
dist[sx][sy] = 0;
while (!q.empty()) {
int x, y;
tie(x, y) = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
while (0 <= nx && nx < n && 0 <= ny && ny < m) {
if (a[nx][ny] == '*') break;
if (dist[nx][ny] == -1) {
dist[nx][ny] = dist[x][y] + 1;
q.push({nx, ny});
}
nx += dx[i];
ny += dy[i];
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> m >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
for (int j = 0; j < m; ++j) {
if (a[i][j] == 'C') {
loc.push_back({i, j});
};
}
}
bfs();
cout << dist[ex][ey] - 1;
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
boj 17140 - 이차원배열과 연산(구현, 정렬) (0) | 2021.07.08 |
---|---|
[BOJ]10026 - 적록색약(dfs) (0) | 2021.07.03 |
[boj]16236 - 아기상어(BFS, 우선순위 큐) (0) | 2021.07.02 |
[BOJ]16954 - 움직이는 미로 탈출(그래프 탐색 - bfs, dfs) (0) | 2021.06.29 |
BOJ 14890 - 경사로(시뮬레이션, 배열) (0) | 2021.04.13 |