Puzzling.SE 친구에게 다음 퍼즐이 게시되었습니다. 이 반음계 퍼즐은 항상 풀 수 있습니까? Edgar G에 의해. 당신은 여기에서 재생할 수 있습니다 .
퍼즐 설명
m x n
세 가지 다른 색상의 타일이 있는 격자가 있으면 색상이 다른 두 개의 인접한 타일을 선택할 수 있습니다 . 그런 다음이 두 타일은 세 번째 색상, 즉이 두 타일로 표시되지 않은 하나의 색상으로 변환됩니다. 모든 타일의 색상이 같으면 퍼즐이 풀 립니다 . 분명히이 퍼즐은 3으로 나눌 수 없거나 나눌 수 없다면 항상 해결할 수 있음 을 증명할 수 있습니다 .m
n
물론 이것은 해결 알고리즘을 요구합니다. 이 퍼즐을 해결하는 기능이나 프로그램을 작성합니다. '부작용'이있는 함수 (즉, stdout
일부 어색한 데이터 형식 반환 값이 아닌 출력이 켜져 있음 )가 명시 적으로 허용됩니다.
입출력
입력은 것 m x n
정수 이루어진 행렬 1
, 2
및 3
(또는 0
, 1
, 2
편리한 경우). 이 입력을 임의의 형식으로 가져올 수 있습니다. 둘 다 m
하고 n
있습니다 >1
과 나눌 수없는 당신은 퍼즐을 가정 할 수있다 (3)에 의해 해결되지 않는다
그런 다음 퍼즐을 해결합니다. 여기에는 '변환'할 두 개의 인접한 타일을 반복해서 선택해야합니다 (위 참조). 해결 알고리즘이 수행 한 각 단계마다이 타일의 두 좌표를 출력합니다. 이것은 정상적인 출력 형식 일 수도 있습니다. 좌표의 0 기반 및 1 기반 색인화와 행 또는 열의 색인화 여부를 자유롭게 선택할 수 있습니다. 그러나 귀하의 답변에 이것을 언급하십시오.
알고리즘은 원래 8x8 사례에서 적절한 시간 내에 실행되어야합니다. 명시 적으로 허용되지 않습니다 완전히 브 루트 - 강제 알고리즘 아래에 실행해야합니다 즉 O(k^[m*(n-1)+(m-1)*n])
와 k
솔루션에 필요한 단계의 수. 그러나 솔루션 이 최적 일 필요 는 없습니다 . 링크 된 질문에 제공된 증거는이 작업을 수행하는 방법에 대한 아이디어를 제공 할 수 있습니다 (예 : 먼저 세로로 인접한 타일 만 사용하여 모든 열을 수행 한 다음 모든 행을 수행)
테스트 사례
이 테스트 사례에서는 좌표가 1 기반이며 행이 먼저 색인됩니다 (MATLAB / Octave 및 기타 여러 유형).
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
원하는 경우 더 큰 테스트 사례의 페이스트 빈을 게시 할 수 있지만 충분하다고 생각합니다.