똥 피하기 게임

시간 제한1초메모리 제한1024 MB

요약
똥이 1초마다 한 칸씩 내려가며 맨 아래를 벗어나면 맨 위로 순환하는 격자에서, 아래쪽 행의 어느 칸에서 시작하면 영원히 똥과 부딪히지 않고 좌우로 움직일 수 있는지 모두 구한다.
난이도

어려움10점 중 8점

유형
그래프, 시뮬레이션, 구현, BFS
정답자
아직 제출이 없습니다

문제

당신의 친구는 '똥 피하기 게임'이라는 재미있는 게임을 개발하고 있다. 그러던 중, 친구는 당신에게 게임 테스트를 요청하였다. 게임의 규칙은 다음과 같다.

  • 게임 화면은 N×MN \times M 크기의 격자이다. 각 칸은 빈 칸이거나, 똥이 놓여 있다. 단, 격자의 맨 아래 행의 칸에는 똥이 놓여 있지 않다.
  • 당신의 캐릭터는 처음에 맨 아래 행의 원하는 칸에 위치할 수 있다.
  • 11초가 지날 때마다, 캐릭터와 똥의 이동이 일어난다. 캐릭터는 왼쪽으로 한 칸 이동하거나, 오른쪽으로 한 칸 이동해야 한다. 이동하고자 하는 방향이 격자 바깥이 아닌 경우에만 이동할 수 있으며, 가만히 멈춰 있을 수는 없다.
  • 각 똥은 11초마다 아래로 한 칸씩 떨어진다. 만약 똥이 격자의 맨 아래 행을 벗어나면, 다시 같은 열의 맨 위 행으로 올라간다.
  • 만약 어떤 순간에 캐릭터와 똥이 같은 칸에 위치하게 되면, 게임은 즉시 끝난다.
  • 각 11초마다 일어나는 캐릭터와 똥의 이동은 모두 동시에 일어나며, 이동하는 데 걸리는 시간과 이동하는 도중 똥과 캐릭터가 같은 칸에 위치하는 경우는 없다고 가정한다.

똥 피하기 게임의 규칙을 읽어본 당신은 한 가지 허점을 발견했다.

정해진 수의 똥이 격자를 계속해서 순환하며 떨어지기 때문에, 처음 똥의 배치만 알면 똥의 움직임을 완전히 예측할 수 있다는 것이다.

그렇다면, 캐릭터가 특정 칸에서 시작해 적절히 움직여서 영원히 게임이 끝나지 않도록 만들 수 있을지도 모른다.

친구를 놀라게 하기 위해, 초기 격자 상태를 보고 맨 아래 행의 어떤 칸에서 시작하면 영원히 게임을 끝내지 않을 수 있는지 모두 찾아보자!

입력

첫째 줄에 두 정수 NN, MM이 주어진다. (N≥2;(N\ge 2; M≥2;M\ge2; N×M≤106)N\times M \le 10^6)

둘째 줄부터 NN개의 줄에 걸쳐, N×MN \times M 크기의 초기 격자의 상태가 맨 위 행부터 맨 아래 행까지 순서대로 주어진다.

이때 각 NN개의 줄은 빈 칸을 나타내는 .와 똥이 있는 칸을 나타내는 X로만 이루어져 있는, 길이가 MM인 문자열이다.

맨 아래 행의 칸에는 똥이 놓여 있지 않다.

출력

첫째 줄에 조건을 만족하는 맨 아래 행의 칸의 개수 KK를 출력한다. (0≤K≤M0 \le K \le M)

둘째 줄에 그러한 칸들이 왼쪽에서부터 몇 번째 열의 칸인지를 나타내는 KK개의 정수를, 오름차순으로 공백으로 구분하여 출력한다.

예제2

  1. 예제 1

    입력
    4 4
    X.X.
    .X.X
    X.X.
    ....
    
    예상 출력
    2
    1 3
    
  2. 예제 2

    입력
    3 4
    X.X.
    .X.X
    ....
    
    예상 출력
    0