만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

직각 칠하기

시간 제한4초메모리 제한256 MB

요약
장애물이 있는 N×N 격자와 시작 칸이 주어질 때, 수평 이동과 수직 이동을 번갈아 하며 빈 칸을 모두 한 번씩 칠할 수 있는지 판단합니다.
난이도

보통10점 중 7점

유형
그래프, 그리디, 구현
정답자
아직 제출이 없습니다

문제

타카하시군은 바닥 칠하기를 좋아합니다. 바닥은 N×NN \times N 격자로 나뉘어 있고, 일부 칸(없을 수도 있음)에는 장애물이 있습니다.

격자는 NN개의 문자열 S1,…,SNS_1, \ldots, S_N으로 주어집니다. SiS_i의 jj번째 문자는 칸 (i,j)(i, j)를 나타냅니다. '.'과 's'는 빈 칸이고, '#'은 장애물이 있는 칸입니다.

's'가 있는 칸은 정확히 하나입니다. 타카하시군은 그 칸에 들어가 칸을 칠합니다. 그 다음 아래 규칙에 따라 0번 이상 이동합니다.

  • 한 번의 이동에서 상하좌우로 인접한 칸 중 하나로 이동하고, 그 칸을 칠합니다.
  • 첫 번째 이동을 제외하고, 이동 방향은 직전 이동에서 90도 바뀌어야 합니다. 가로로 움직인 뒤에는 세로로, 세로로 움직인 뒤에는 가로로 움직입니다.
  • 이미 칠한 칸에 들어갈 수 없습니다.
  • 장애물이 있는 칸에 들어갈 수 없습니다.
  • 격자 밖으로 나갈 수 없습니다.

입력

NN S1S_1 S2S_2 ⋮\vdots SNS_N

출력

장애물이 없는 모든 칸을 칠할 수 있으면 "POSSIBLE"을, 그렇지 않으면 "IMPOSSIBLE"을 출력합니다.

제한

  • 1≤N≤4001 \leq N \leq 400
  • ∣Si∣=N|S_i| = N
  • SiS_i의 각 문자는 '.', '#', 's' 중 하나입니다.
  • 's'는 정확히 하나입니다.
  • '.'는 최소 하나 있습니다.

예제2

  1. 예제 1

    입력
    5
    #....
    ..s..
    ..#..
    #....
    ##..#
    
    예상 출력
    POSSIBLE
    
  2. 예제 2

    입력
    5
    s.###
    ..###
    ###..
    #....
    #..##
    
    예상 출력
    IMPOSSIBLE