만드는 중입니다

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

Carcassonne

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

요약
n×n 보드에 k개의 새 타일을 놓을 때, 각 타일이 앞서 놓인 타일과 변을 맞대는 최종 배치의 서로 다른 개수를 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움10점 중 8점

유형
행렬, BFS, 조합론
정답자
아직 제출이 없습니다

문제

Bajtazar는 최근 Carcassonne 게임에 빠졌다. 이 게임에서 플레이어들은 차례로 한 변의 길이가 1인 정사각형 타일을 보드에 놓는다. 첫 번째 타일을 제외한 새 타일은 이전에 놓인 타일과 적어도 한 변을 맞대고 있어야 한다. 각 플레이어는 이전 타일을 놓자마자 새 타일을 뽑으므로, Bajtazar는 다른 플레이어가 움직이는 동안 자신의 다음 수를 미리 정할 수 있다. 다만 상대가 Bajtazar가 두려던 칸에 타일을 놓을 경우에 대비해 여러 수를 고려해야 한다.

보드는 n×nn \times n 칸이다(Bajtazar의 테이블에는 크기 제약이 있다). 이미 타일이 일부 놓여 있다. Bajtazar는 이제 kk 명의 상대 플레이어가 움직이기를 기다린다. kk 명이 수를 둔 뒤 나올 수 있는 서로 다른 배치가 몇 가지인지 구하라. 타일의 그림은 무시한다. 어떤 칸에 한 배치에서는 타일이 있고 다른 배치에서는 없다면, 두 배치는 다른 것이다.

입력

첫 줄에 정수 nn과 kk가 주어진다(2≤n≤30002 \le n \le 3000, 1≤k≤41 \le k \le 4). nn은 보드의 한 변 길이이고, kk는 Bajtazar의 상대 플레이어 수다. 이어지는 nn 줄에는 #와 .으로 이루어진 nn 글자 문자열이 하나씩 주어진다. ii 번째 줄의 jj 번째 글자는 ii 행 jj 열의 칸을 뜻한다. .은 빈 칸, #은 타일이 놓인 칸이다. 보드에는 타일이 적어도 하나 있고, 빈 칸은 적어도 kk 개 있다.

출력

kk 번의 수 이후 나올 수 있는 서로 다른 배치의 개수를 정수 하나로 출력한다. 답은 109+710^9 + 7로 나눈 나머지로 출력한다.

예제1

  1. 예제 1

    입력
    3 2
    .#.
    ##.
    #..
    
    예상 출력
    8