수 호퍼 미로 해결


18

내 8 살짜리 아이는 기존의 미로를 만드는 데 지루해졌으며 다음과 같은 변형을 만들었습니다.

수 호퍼 샘플

아이디어는 x에서 시작하여 일반 규칙을 통해 o에 도달하는 것입니다. 또한 모든 정수 에서 다른 정수 b로 "홉"할 수 있지만 | a - b | 특권을위한 달러. 목표는 최소 비용으로 미로를 해결하는 것입니다. 위의 예에서 비용 5로 x-14-18-27-28-o를 통해 x에서 o로 갈 수 있지만 x-13-11-9-8-29-28-o 만 사용하는 것이 더 저렴합니다. 4.ab|ab|

그래서 여기 내 질문이 있습니다 : 당신이 이것을 해결할 때 생각할 수있는 가장 좋은 해결책은 무엇입니까? 입력 형식에 대해 합리적인 가정을 할 수 있습니다.

참고 : 답변을 염두에두고 여기에 "퍼즐"태그를 사용하고 있지만 최적인지 확실하지 않으며 다른 사람이 내 솔루션을 개선 할 수 있는지 확인하고 싶습니다. (여기서 n 은 미로의 정수입니다.)O(n2)n


7
이러한 창의적이고 수학적인 퍼즐을 만들기 위해 자녀에게 소품!
bbejot

2
@bbejot 당신은 그가 나에게 요구하는 것들 중 일부를보아야한다 ... 때때로 나는 그의 질문에 대답 할 수 없다. 예 : math.stackexchange.com/questions/33094/…
Fixee

1
귀하의 비용 계산이 정확한지 확실하지 않습니다. x-14-18-27-28-o는 이고 x-13-11-9-8-29-28-o는 2 + 2 + 1 + 21 + 1 = 27 이어야합니다 . 4+9+1=142+2+1+21+1=27
Dave Clarke

1
@ 모든 전환이 점프하는 것은 아닙니다. 우리는 (의 비용이 점프에 대한 'AB'쓸 수 (의 비용이있는 A에서 B로 그래프에서 산책과 'A-> B') 0 경우에만 허용된다) 그들은 미로에서 벽을 깰 필요가 없습니다. 이 표기법에서 우리는 x-> 14-18-> 27-28-> o와 5의 비용과 x-> 13-11-> 9-8-> 29-28-> o를가집니다. 나는 얇은 Fixee가 중복이라는 이유로이 표기법을 도입하지 않았다. 두 번 홉할 이유가 없으므로 미로에서 홉과 보행이 번갈아 가며 나타날 것이다. |ab|0
Artem Kaznatcheev

2
이것은 훌륭한 숙제 문제입니다!
Jeffε

답변:


15

Dijkstra 알고리즘의 변형을 사용하여 시간으로 이것을 해결할 수 있습니다 . 새 노드를 방문 할 때 모든 거리 업데이트를 수행하지 않아도됩니다. 우리는 노드 방문 할 경우 Y를 , 우리의 모든 것을 걷기의 거리를 업데이트하기 만하면 y를 0으로하고, 두 개의 노드까지의 거리 업데이트하기 위해 Y -Y + 에 가장 가까운 값을 Y 보다 적은 더 큰 y를 하지 않은 어떤 아직 선택되었습니다.O(nlogn)yyyy+yy

가장 가까운 노드는 이미 방문한 노드 바로 위 또는 바로 아래에 있어야하기 때문에 이러한 업데이트는 힙이 최소 요소를 반환하도록하기에 충분합니다.

각 노드는 최대 한 번만 0으로 업데이트됩니다 (2 차 동작을 피하기 위해 대기열에서 모든 0 거리 노드를 튀어 나오는 경우). 노드를 추가 할 때마다 O (1) 다른 업데이트 만 수행합니다. 값을 찾기 Y +는 우리는 또한 모든 노드의 이중 연결리스트를 주문한 유지하는 경우 선형 시간에 수행 할 수 있습니다, 그 정수 값으로 분류. 이 이중 연결리스트를 구축한다 O ( N 로그 N ) 시간을, 마지막으로 O ( N ) 힙 걸릴에서 업데이트와 팝을 O ( N 로그 N ) 의 총 실행을 위해, 시간을 O (yy+O(nlogn)O(n)O(nlogn)O(nlogn)


정수에 특화된 정렬 및 우선 순위 대기열을 사용하면 약간 향상 될 수 있지만 다음과 같은 감소로 볼 수 있듯이 정수 정렬보다 더 나을 수는 없습니다. 정수 값 , x 를 최소값의 2 배로 설정 하고 o 를 최대 값의 2 배로 설정합니다. 서로 x i 에 대해 값이 2 x i2 x i + 1 인 영역을 만듭니다 . 가장 좋은 솔루션은 x i 별로 정렬 된 순서대로 각 지역을 통과 하므로x1,,xnxo2xi2xi+1xixi 값. xi
Dave

데이브이 감소 될 수 있고, 적합한 만을 업데이트함으로써 Y +Y - . 또한 영역의 모든 노드를 영역의 다른 모든 노드에 연결하는 대신 영역의 하나 또는 2 개의 다른 노드에만 연결하면됩니다 (경로 만들기). 따라서 각 노드에는 최대 4 개의 모서리 만 있습니다. 그런 다음 Dijkstra의 알고리즘 (최소 우선 순위 큐 포함)은 O ( n l g n ) 시간을 부여하여 적용될 수 있습니다. O(nlgn)y+yO(nlgn)
bbejot

@bbejot : 그렇다면 Thorup의 통합 우선 순위 대기열이 실행 되지 않은 상황에서 추가 버킷 팅 기술을 사용하여 실행 시간을 또는 심지어 O ( n ) 로 개선하지 않습니까? O(nloglogn)O(n)
Hsien-Chih Chang 張顯 之

4

나는 가 당신이 얻을 수있는 최선이라고 생각합니다.O(n2)

특수 시작 노드 (x)와 끝 노드 (0)를 사용하여이를 최단 경로 문제로 변환하는 것이 당연합니다. 각 숫자마다 다른 노드가 하나 있습니다. x와 0은 미로에서 도달 할 수있는 모든 수 노드에 대해 가중치 0의 모서리를가집니다. 모든 숫자 노드는 가중치 0 (숫자가 도달 할 수있는 경우) 또는 숫자 (미로 도달 할 수없는 경우)의 차이로 연결됩니다.

이 그래프의 최단 경로 는 그래프에 대략 n 2 개의 모서리가 있으며 최악의 경우 모든 경우를 한 번 봐야하기 때문에 미만으로 해결할 수 없습니다 . 따라서 최단 경로에 대한 Dijkstra'a 알고리즘은 O ( n 2 ) 시간 이 걸리며 최악의 경우 최적입니다.O(n2)n2O(n2)


이것이 내가 생각한 대답입니다. 물론 Dijkstra의 알고리즘과 함께 적절한 데이터 구조를 사용하여 실행 시간 을 가져와야 합니다. 일반적인 이진 힙을 사용하면 O ( n 2 lg n )가 생성 됩니다. O(n2)O(n2lgn)
Fixee

1
오늘 아침에이 문제에 대해 생각하고 있었으며 조금 더 빨라질 수 있습니다. 미로의 각 숫자에 대해 하나의 노드를 사용하는 대신 미로의 각 영역에 하나의 노드를 사용하십시오. 노드 간 비용은 한 지역에서 다음 지역으로 점프하는 데 드는 최소 비용입니다. 시작 노드는 x가있는 영역이고 끝 노드는 0이있는 영역입니다. 영역이있는 경우 논의한 방법 으로 O ( r 2 ) 시간 안에 해결할 수 있습니다 . rO(r2)
bbejot

O(nlogn)O(r2+nlogn)Ω(nlogn)

Ω(n2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.