산타클로스와 루돌프
시간 제한12초메모리 제한128 MB
외길 직선 이동만 가능한 루돌프를 타고 교회에서 출발해 모든 집을 정확히 한 번 방문하고 다시 교회로 돌아오는 경로의 수를 센다. 이미 방문한 집 위로는 지나갈 수 없다.
문제
산타클로스는 어떤 동네에 사는 모든 아이에게 선물을 나누어 주려고 한다. 동네의 모든 집에는 아이가 살고 있으므로, 산타는 모든 집을 빠짐없이 방문해 선물을 주어야 한다. 올해 산타를 태우고 다닐 루돌프는 길을 잘 못 찾아서, 건물이 아닌 곳에는 내릴 수 없다. 그래서 산타는 선물을 나누어 줄 방법을 미리 계획하려고 한다.
동네는 1×1 크기의 칸들로 나뉘어 있고, 각 칸은 집, 교회, 공터 중 하나이다. 교회는 정확히 한 곳뿐이다. 산타와 루돌프는 교회에서 출발하여 모든 집에 선물을 나누어 준 뒤 다시 교회로 돌아와야 하며, 다음 규칙을 지켜야 한다.
- 루돌프는 동, 서, 남, 북 네 방향으로만 직선으로 날 수 있고, 공중에서는 방향을 바꿀 수 없다.
- 아직 선물을 주지 않은 집 위는 자유롭게 지나갈 수 있다. 그런 집에 내리면 반드시 선물을 주어야 하고, 그 다음 다시 네 방향 중 하나로 날아오른다.
- 모든 집에는 벽난로가 있다. 산타가 오기 전에는 불이 꺼져 있다. 같은 집에 두 번 선물을 주지 않기 위해, 산타는 날아오를 때 벽난로에 불을 붙인다. 불을 붙이면 굴뚝에서 연기가 나므로, 이미 선물을 준 집 위는 지나갈 수 없다.
- 교회 위는 자유롭게 지나갈 수 있다. 다만 예배 중이므로, 모든 집에 선물을 다 주기 전에는 교회에 내릴 수 없다.
- 공터 위는 자유롭게 지나갈 수 있지만, 공터에는 내릴 수 없다.
동네의 구조가 주어졌을 때, 산타와 루돌프가 선물을 나누어 줄 수 있는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 동네의 가로 크기 과 세로 크기 이 공백으로 구분되어 주어진다. () 다음 개의 줄에는 각각 개의 수가 공백으로 구분되어 주어진다. 각 수는 해당 칸의 상태를 나타내며 0, 1, 2 중 하나이다. 0은 공터, 1은 집, 2는 교회를 뜻한다. 교회는 항상 정확히 1개이고, 집의 개수는 1개 이상 23개 이하이다.
출력
첫째 줄에 선물을 나누어 줄 수 있는 방법의 수를 출력한다. 이 값은 2,000,000 이하임이 보장된다.