#include"3197.h"
#define INF 0x3f3f3f3f
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
typedef pair<int, int> pii;
// 실수 1. using namespace std 뒤에 typedef 선언해야 되는거 몰랐음
// 실수 2. vector 제대로 초기화 안 하고 새로 선언으로 떼우려고 함.
// 실수 3. 물이랑 겹치는 것만 넣어야 되는데, 모든 얼음을 큐에 넣어버렸음.
// 실수 4. 오리 둘 다 bfs 때려야 얼음이 골고루 녹는데 한 오리만 bfs 때림
// 실수 5. 오리 둘 다 bfs 때려도 얼음이 감싼 얼음은 안 녹음. 따로 bfs 해야됨.
void B3197::Solution()
{
fastio;
// 얼음 녹인 뒤에 체크체크
int R, C;
string s;
cin >> R >> C;
vector<string> lake(R);
for (int i = 0; i < R; i++)
cin >> lake[i];
queue<pii> iceq;
vector<pii> ducks;
vector<int> dx = { 1,-1,0,0 };
vector<int> dy = { 0,0,1,-1 };
// 오리를 찾고, 얼음 큐 시작을 넣어놓는다.
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (lake[i][j] == 'L') {
ducks.push_back(make_pair(i, j));
}
else if (lake[i][j] == 'X') {
for (int k = 0; k < 4; k++) {
int newi = i + dx[k];
int newj = j + dy[k];
if (0 <= newi && newi < R && 0 <= newj && newj < C
&& lake[newi][newj] == '.')
{
iceq.push(make_pair(i, j));
break;
}
}
}
}
}
int day = 0;
bool found = false;
while (!iceq.empty())
{
queue<pii> duckq;
vector<vector<bool>> visited(R, vector<bool>(C));
pii duck0 = ducks[0];
duckq.push(duck0);
visited[duck0.first][duck0.second] = true;
// 오리가 길 탐색 시도
while (!duckq.empty())
{
pii d = duckq.front();
duckq.pop();
for (int i = 0; i < 4; i++) {
int newx = d.first + dx[i];
int newy = d.second + dy[i];
if (0 <= newx && newx < R && 0 <= newy && newy < C
&& !visited[newx][newy] && lake[newx][newy] != 'X')
{
if (lake[newx][newy] == 'L') found = true;
else {
visited[newx][newy] = true;
duckq.push(make_pair(newx, newy));
}
}
}
}
if (found) break;
// 얼음 녹임
int qlen = iceq.size();
while (qlen--)
{
pii ice = iceq.front();
iceq.pop();
lake[ice.first][ice.second] = '.';
for (int i = 0; i < 4; i++) {
int newx = ice.first + dx[i];
int newy = ice.second + dy[i];
if (0 <= newx && newx < R && 0 <= newy && newy < C
&& !visited[newx][newy] && lake[newx][newy] == 'X')
{
visited[newx][newy] = true;
iceq.push(make_pair(newx, newy));
}
}
}
day++;
}
std::cout << day;
}
풀이 작성도 오래 걸렸고,
결국 결과도 시간 초과.
내일 다시 생각해보기.