아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

더 어려운 소코반 문제

시간 제한5초메모리 제한128 MB

요약
플레이어와 컨테이너의 시작 칸을 정해 컨테이너를 목적지 칸으로 옮기는 최소 이동 횟수가 최대가 되도록 할 때 그 값을 구한다.
난이도

어려움10점 중 8점

유형
BFS, 그래프, 동적 계획법, 구현
정답자
아직 제출이 없습니다

문제

N×NN \times N 크기의 직사각형 격자에서 진행하는 소코반 게임이다. 각 칸은 빈 칸(., ASCII 46)이거나 벽(#, ASCII 35)이다. 또한 목적지 칸이 정확히 하나 있으며 *(ASCII 42)로 표시된다.

빈 칸 중 한 칸에는 플레이어가, 다른 한 칸에는 상자가 놓여 있다. 플레이어는 상하좌우로 인접한 빈 칸으로 한 칸씩 이동할 수 있다. 플레이어가 이동하려는 칸에 상자가 있으면, 그 상자는 같은 방향으로 한 칸 밀려난다. 단, 상자가 밀려나는 칸은 반드시 빈 칸이어야 한다(벽이거나 격자 밖이면 그 방향으로는 밀 수 없다).

소코반의 잘 알려진 목표는 상자를 목적지 칸으로 옮기는 것이며, 이때 이동 횟수를 최소로 한다. 한 번의 이동이란 플레이어가 한 칸 움직이는 것을 뜻하고, 그 이동이 상자를 미는 경우도 한 번으로 센다.

이 문제에서 풀어야 하는 것은 그 반대이다. 격자가 주어졌을 때, 플레이어와 상자의 시작 위치를 직접 골라서, 상자를 목적지로 옮기는 데 필요한 최소 이동 횟수가 최대가 되도록 하라. 그 최댓값을 출력한다.

상자를 목적지로 옮길 수 없는 배치는 고려하지 않는다. 상자를 처음부터 목적지 칸에 놓으면 이동이 0번 필요하므로, 답은 항상 0 이상이다.

입력

첫째 줄에 격자의 크기 NN이 주어진다. 이어지는 NN개의 줄에는 각각 NN개의 문자가 주어지며, 격자를 나타낸다. 입력 격자에는 목적지 칸과 인접한 빈 칸이 항상 하나 이상 존재한다.

출력

상자를 목적지로 옮기는 데 필요한 최소 이동 횟수의 최댓값을 정수 하나로 출력한다.

제한

  • 2≤N≤252 \le N \le 25

예제4

  1. 예제 1

    입력
    2
    ..
    .*
    
    예상 출력
    0
    
  2. 예제 2

    입력
    3
    ..#
    ...
    ..*
    
    예상 출력
    10
    
  3. 예제 3

    입력
    3
    ..*
    ...
    ...
    
    예상 출력
    7
    
  4. 예제 4

    입력
    3
    ...
    .*.
    ...
    
    예상 출력
    0