날짜 계산식을 따로 만들어야하는구나 생각했다.
근데 아니었다. 걍 거리 계산하는거랑 똑같은거였다. 내가 생각이 많았다.
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };
struct Pos
{
Pos() = default;
Pos(int a, int b) : y(a), x(b)
{
}
int x;
int y;
bool operator!= (const Pos& other)const
{
if (x == other.x)
{
if (y == other.y)
{
return false;
}
}
return true;
}
bool operator== (const Pos& other)const
{
return !(*this != other);
}
bool operator<(const Pos& other)const
{
if (x != other.x)
{
return x < other.x;
}
return y < other.y;
}
};
int main(void)
{
int n, m;
cin >> n >> m;
vector<vector<int>> vec(m, vector<int>(n));
int all1 = 0;
vector<Pos> onbox;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
int num;
cin >> num;
if (num == 1 || num == 0)
{
all1++;
if (num == 1)
{
onbox.push_back(Pos(i, j));
}
}
vec[i][j] = num;
}
}
int answer = onbox.size();
int day = 0;
vector<vector<bool>> visited(m, vector<bool>(n, false));
vector<vector<int>> days(m, vector<int>(n, 0));
for (int i = 0; i < onbox.size(); ++i)
{
int y = onbox[i].y;
int x = onbox[i].x;
days[y][x] = 0;
}
queue<Pos> q;
for (int i = 0; i < onbox.size(); ++i)
{
q.push(onbox[i]);
}
while (!q.empty())
{
Pos pos = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int x = pos.x + dx[i];
int y = pos.y + dy[i];
Pos next(y, x);
if (x < 0 || x >= n || y < 0 || y >= m)
{
continue;
}
if (vec[y][x] == -1 || vec[y][x] == 1)
{
continue;
}
q.push(next);
vec[y][x] = 1;
answer++;
days[next.y][next.x] = days[pos.y][pos.x] + 1;
if (day < days[next.y][next.x])
{
day = days[next.y][next.x];
}
}
}
if (all1 == answer)
{
cout << day;
}
else
{
cout << -1;
}
return 0;
}
'코딩 테스트' 카테고리의 다른 글
백준 - 11729 하노이의 탑 (0) | 2024.08.27 |
---|---|
백준 - 14502 연구소 (0) | 2024.08.27 |
백준 - 1926 그림 (0) | 2024.08.26 |
백준 : 5014 스타트링크 (0) | 2024.08.26 |
백준 7562 나이트의 이동 (0) | 2024.08.25 |