✅ 한 것들
⚔️ 백준
9376 탈옥
#include"9376.h"
using namespace std;
typedef vector<vector<char>> vvc;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef pair<int, int> pii;
bool ExceedRange(int newi, int newj, int h, int w)
{
return newi >= h + 2 || newi < 0 || newj >= w + 2 || newj < 0;
}
void DrawMinDoor(pii start, vvc& prison, vvi& notepad, vvb& visited, int h, int w)
{
visited = vvb(h + 2, vector<bool>(w + 2, false));
deque<pii> dq;
dq.push_front(start);
int si = start.first;
int sj = start.second;
visited[si][sj] = true;
vector<pii> dirs = { {-1,0},{1,0},{0,-1},{0,1} };
while (!dq.empty())
{
pii df = dq.front(); dq.pop_front();
int doorCount = notepad[df.first][df.second];
for (pii dir : dirs)
{
int newi = df.first + dir.first;
int newj = df.second + dir.second;
if (ExceedRange(newi, newj, h, w)) continue;
if (visited[newi][newj]) continue;
if (prison[newi][newj] == '#')
{
visited[newi][newj] = true;
notepad[newi][newj] = doorCount + 1;
dq.push_back({ newi,newj });
}
else if (prison[newi][newj] != '*')
{
visited[newi][newj] = true;
notepad[newi][newj] = doorCount;
dq.push_front({ newi,newj });
}
}
}
}
int GetMinDoor(int h, int w)
{
pii prisoner1 = { 0,0 }, prisoner2;
vvc prison = vvc(h + 2, vector<char>(w + 2, '.'));
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
cin >> prison[i][j];
if (prison[i][j] == '$')
{
if (prisoner1 == make_pair(0, 0)) { prisoner1 = { i,j }; }
else { prisoner2 = { i,j }; }
}
}
}
vvb visited;
vvi sangen = vvi(h + 2, vector<int>(w + 2, 0));
vvi mindoor1 = vvi(h + 2, vector<int>(w + 2, 0));
vvi mindoor2 = vvi(h + 2, vector<int>(w + 2, 0));
DrawMinDoor({ 0,0 }, prison, sangen, visited, h, w);
DrawMinDoor(prisoner1, prison, mindoor1, visited, h, w);
DrawMinDoor(prisoner2, prison, mindoor2, visited, h, w);
int minDoor = 1000001;
for (int i = 0; i < h + 2; i++)
{
for (int j = 0; j < w + 2; j++)
{
if (!visited[i][j]) continue;
int door = sangen[i][j] + mindoor1[i][j] + mindoor2[i][j];
if (prison[i][j] == '#') door -= 2;
minDoor = min(minDoor, door);
}
}
return minDoor;
}
void B9376::Solution()
{
int t, h, w;
cin >> t;
while (t--)
{
cin >> h >> w;
cout << GetMinDoor(h,w) << '\n';
}
}
- 사방이 벽으로 둘러싸서 방문하지 못하는 점이 있으면 최소 취급을 해주면 안된다
- 그걸 visited로 체크할 거면 doorCount 체크 하지 않을 때는 visited = true도 안되게 해야 했는데 무조건 true되는 것 때문에 헤맴