문제
https://www.acmicpc.net/problem/3055
설명
multisourceBfs의 문제이다 그러나 알아보지 못했다가 틀렸다가 해결
- 문제에서'D'와 'S'는 하나씩만 주어진다.라고 적혀있다. 이점을 보면 물은 하나씩만 주어지라는 '보장'이 없는 것이다. -> 그럼 멀티소스 bfs ㄱㄱ
소스
#include <bits/stdc++.h>
using namespace std;
int r, c, ans;
char grid[100][100];
int Water[100][100];
int visited[100][100];
int Watervisited[100][100];
pair<int, int> startPos, endPos;
vector<pair<int, int>> waterPos;
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
bool CanGo(int x, int y) {
if (visited[x][y] != -1 || x < 0 || y < 0 || x >= r || y >= c || grid[x][y] == '*' || grid[x][y] == 'X') return false;
return true;
}
bool WaterCanGo(int x, int y) {
if (Watervisited[x][y] != -1 || x < 0 || y < 0 || x >= r || y >= c || grid[x][y] == 'X') return false;
return true;
}
void WaterBfs() {
queue<pair<int, int>> q;
for (int i = 0; i < waterPos.size(); i++)
{
//cout << waterPos[i].first << " " << waterPos[i].second << endl;
q.push({ waterPos[i].first, waterPos[i].second });
Watervisited[waterPos[i].first][waterPos[i].second] = 0;
}
while (!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (WaterCanGo(nx, ny)) {
if (grid[nx][ny] == 'D') continue;
q.push({ nx, ny });
Watervisited[nx][ny] = Watervisited[x][y] + 1;
}
}
}
}
int bfs() {
queue<pair<int, int>> q;
q.push({ startPos.first, startPos.second });
visited[startPos.first][startPos.second] = 0;
while (!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
if (grid[x][y] == 'D') {
return visited[x][y];
}
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (CanGo(nx, ny)) {
if (Watervisited[nx][ny] > visited[x][y] + 1 || Watervisited[nx][ny] == -1) {
visited[nx][ny] = visited[x][y] + 1;
q.push({ nx, ny });
}
}
}
}
return -1;
}
int main() {
cin >> r >> c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> grid[i][j];
if (grid[i][j] == 'S') {
startPos = make_pair( i ,j );
}
else if (grid[i][j] == 'D') {
endPos = make_pair(i, j);
}
else if (grid[i][j] == '*') {
waterPos.push_back({ i, j });
}
}
}
memset(Watervisited, -1, sizeof(Watervisited));
memset(visited, -1, sizeof(visited));
WaterBfs();
ans = bfs();
if (ans == -1) cout << "KAKTUS";
else cout << ans;
return 0;
}
'알고리즘' 카테고리의 다른 글
ub가 떴다. (주의), tie문법, 장애물 치우기(bfs + dfs) (0) | 2021.12.06 |
---|---|
신박한 부분문자열, 데브매칭 (0) | 2021.12.05 |
K번째 수 백준 1300 (0) | 2021.12.03 |
백준 달나라 토끼를 위한 구매대금 지불 도우미 17212번 (0) | 2021.12.03 |
백준 핑거스냅 17394번 (0) | 2021.12.03 |