그리드에서 일련의 노드 감지 최상의 움직임은 아닙니다. 규칙은 다음과 같습니다. 동일하고 이웃 타일로

아래 이미지가 주어지면 보드에서 가장 최적의 시퀀스 (녹색 선)를 감지해야합니다. 파란색 / 빨간색 선은 가능하지만 최상의 움직임은 아닙니다.

규칙은 다음과 같습니다.

  1. 동일하고 이웃 타일로 이동할 수 있습니다 (대각선이 유효 함)
  2. 타일을 방문한 후에는 다시 방문 할 수 없습니다.

각 노드를 반복하고 이웃을보고 재귀 적으로 통과하는 것에 대해 생각했습니다. 가능한 움직임을 찾으면 구조에 넣을 수 있습니다. 가능한 모든 움직임이 발견되면 노드 수가 가장 많은 움직임을 선택합니다. 노드에 일치하는 인접 노드가 둘 이상 있으면 더 어려워집니다.

그래서 사용할 수있는 알고리즘이 있습니까? 나는 어떤 종류의 홍수 채우기를 생각하고 있었지만 규칙 # 2를 충족시키지 못합니다.

요청에 따라 유사한 게임 플레이 비디오가 있습니다. http://youtube.com/watch?v=eumnCTG0AE8

여기에 이미지 설명을 입력하십시오



답변

링크 된 동일한 기호 각 그룹을 고려할 수 (및 연결에 의해 당신이 하나 개의 심볼에서 다른 여행 수 있음을 의미) 별도의 그래프 . 이러한 각 그래프에 대해 해당 그래프의 가장 긴 경로의 일부가 아닌 그래프의 각 노드에서 시작하는 DFS ( Depth First Search)를 적용하십시오 . DFS를 적용하는 동안 막 다른 골목에 도달 할 때마다 방금 통과 한 경로가 지금까지 찾은 전역 최대 길이보다 긴지 확인하십시오. 그렇다면 새로운 가장 긴 경로로 저장하십시오.

이전 단락에서 각 그래프에 대해 DFS를 여러 번 적용하는 것에 대해 언급했음을 알 수 있습니다. 그래프에서 실행 된 단일 DFS로는 충분하지 않습니다. 이 특별한 경우를 고려하십시오.

    1
1 1 1
    1
    1
    1
    1

우연히 맨 위 노드에서이 그래프에 대해 DFS를 먼저 실행하면 가능한 가장 긴 경로가 세로선 인 것으로 발견되지만 올바르지 않습니다. 이는 결과 경로 내에 있거나 전혀 포함되지 않은 노드에서 DFS 알고리즘을 시작할 때마다 발생합니다. 이 특정 예제에서해야 할 일은 두 번째 줄의 가장 왼쪽 노드에서 DFS 알고리즘을 시작하는 것입니다. 올바른 경로를 찾을 수 있습니다. 일반적으로 말하자면 위에서 언급 한 것처럼 현재 해당 그래프의 가장 긴 경로에 포함되지 않은 각 노드에서 DFS 알고리즘을 실행해야합니다.

이 알고리즘의 최악의 시나리오는 보드가 채워지거나 대부분 단일 기호 유형으로 채워져 있지만 게임에서는 발생하지 않을 것입니다. 또한 각 그래프의 가장 긴 경로를 저장하는 방법에주의하십시오. 이 비트를 최적화하지 않으면 스테이지의 각 노드에 대해 DFS를 호출하는 것이 좋습니다. 매우 큰 보드로 작업하지 않고 속도가 큰 문제가 아니라고 가정하면이 솔루션은 충분히 빠릅니다.

기술적으로 말하자면, 보드를 별도의 그래프로 분류하면 여러 개의 ” 최장 경로 문제 “가 발생합니다. 예제에서 볼 수 있듯이 그래프에주기가있을 수 있습니다 (예 : 동일한 유형의 스테이지 외부에 모든 기호가 있음).이 특정 문제에서 가장 긴 경로를 찾아야합니다. 여러 개의 정주기 방향성 그래프에서 다항식 시간에 수행 할 수 없습니다 .

이것이 너무 느리다 면 개별 “가장 긴 경로 문제”를 최적화하는 방법에 대한 자세한 내용은 StackOverflow 에서이 답변 을 참조하십시오 .