본문 바로가기
알고리즘 문제풀이/백준

[백준 4179] 불!

by m2162003 2020. 12. 10.

www.acmicpc.net/problem/4179

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net

 

이전에 풀었던 문제와 유사하다. 불과 지훈이가 동시에 움직일 때 지훈이는 건물밖으로 벗어나면 탈출하는 문제이다.

 

불이 먼저 움직여야 정확한 결과가 나온다.

따라서 불의 시작 위치를 푸쉬하고 지훈이의 위치는 나중에 푸쉬한다.

 

불의 경우 미로 내에서 .이거나 J이면 이동한다. 이동후에는 미로에 F 표시를 한다.

지훈이는 미로내에서 .이면 이동가능하다. 

 

주의할 점은 q.front에서 건물밖인지 판단하는 건 불가능하다. 왜냐면 for문을 돌면서 miro와 visited에서 범위를 벗어낫기 때문

#include <stdio.h>
#include <queue>

using namespace std;

int r, c, sr, sc;
char miro[1000][1000];
int visited[1000][1000];
int drow[4] = {1, -1, 0, 0};
int dcol[4] = {0, 0, -1, 1};

struct S
{
  int x, y;
  bool fire;
};
queue<S> q;

bool isValid(int row, int col)
{
  if (row < 0 || col < 0 || row > r - 1 || col > c - 1)
  {
    return false;
  }

  return true;
}

int bfs()
{
  q.push({sr, sc, false});
  visited[sr][sc] = 1;
  while (!q.empty())
  {
    S fr = q.front();

    q.pop();

    if (fr.fire == true)
    {
      for (int i = 0; i < 4; i++)
      {
        int nextR = fr.x + drow[i];
        int nextC = fr.y + dcol[i];

        if (isValid(nextR, nextC) && (miro[nextR][nextC] == '.' || miro[nextR][nextC] == 'J'))
        {
          q.push({nextR, nextC, true});
          miro[nextR][nextC] = 'F';
        }
      }
    }
    else
    {
      for (int i = 0; i < 4; i++)
      {
        int nextR = fr.x + drow[i];
        int nextC = fr.y + dcol[i];

        if (!isValid(nextR, nextC))
        {
          return visited[fr.x][fr.y];
        }

        if (isValid(nextR, nextC) && miro[nextR][nextC] == '.' && visited[nextR][nextC] == 0)
        {
          q.push({nextR, nextC, false});
          visited[nextR][nextC] = visited[fr.x][fr.y] + 1;
        }
      }
    }
  }
  return -1;
}

int main(void)
{
  scanf("%d %d", &r, &c);

  for (int i = 0; i < r; i++)
  {
    scanf("%s", miro[i]);
    for (int j = 0; j < c; j++)
    {
      if (miro[i][j] == 'F')
      {
        q.push({i, j, true});
      }

      if (miro[i][j] == 'J')
      {
        sr = i;
        sc = j;
      }
    }
  }

  int result = bfs();

  if (result == -1)
  {
    printf("IMPOSSIBLE\n");
  }
  else
  {
    printf("%d\n", result);
  }

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1941] 소문난 칠공주  (0) 2020.12.11
[백준 3197] 백조의 호수  (0) 2020.12.11
[백준 11967] 불켜기  (0) 2020.12.10
[백준 5427] 불  (0) 2020.12.03
[백준 9466] 텀 프로젝트  (0) 2020.12.03

댓글