문제는 한 값을 이동하면 다른 값이 바뀌기 때문입니다. 나는 충분한 이론으로 당신이 정확한 해결책을 찾을 수 있다고 생각하지만 여기에는 일할 기회가 더 많은 경험적 방법이 있습니다.
먼저 행에있는 모든 숫자가 해당 행에 속하면 문제를 풀거나 사소한 값을 교환해야합니다. [2,3,1]은 예를 들어 [3,2,1]이 바뀌는 반면 간단합니다.
그래서 왼쪽 위 1 개를 배치하는 것보다 "쉬운"목표는 모든 행을 그 상태로 가져 오는 것입니다. 우리가 어떻게 할 수 있을까? 열을 살펴 봅시다 ...
열에 각 행에서 하나의 숫자가 포함되어 있으면 위와 비슷한 상태입니다 (숫자가 올바른 행에 있거나 너무 바뀌기 때문에 너무 간단합니다).
그럼, 내가 제안하는 것은입니다 :
for column in columns:
if column is not one value from each row:
pick a value from column that is from a duplicate row
rotate that row
for column in columns:
as well as possible, shift until each value is in correct row
for row in rows:
as well as possible, shift until each value is in correct column
지금, 그이 그것을 가까이하는 경향이 있지만, 작동하지 않을 수 있으며, "거의 바로"계약의 일부 세트를 해결할 수 있습니다.
그래서 루프에 넣고 각 실행마다 상태의 "해시"(예 : 행별로 읽는 값이 들어있는 문자열)를 기록합니다. 그런 다음 각 호출마다 상태가 이미 발생했기 때문에 해시가 이미 있었는지 확인하여 (우리가 스스로를 반복하므로) 일을 혼합하는 "임의의 셔플"을 호출합니다.
그래서 우리는 일단 우리가 가까워지면 일할 수있는 기회를 가지며, 우리가 그 일에 매달려있을 때 휴식을 취할 수있는 생각을 갖고 있습니다.
내가 말했듯이, 나는 이것을 할 수있는 더 똑똑한 방법이 있다고 확신하지만, 필자는 필사적으로 구글에서 아무 것도 찾을 수 없다면 그것은 내가 시도 할만한 발견 적 방법 일 것이다.난 확실하지 않다 위의 권리이지만,보다 일반적인 전술은 다음과 같습니다
- (퍼즐은 "선형"이고, 찾아 의미에서)
- 시도를 매우 가까운 솔루션을 해결할 것을 확인 이
을 반복하고 내가 여기서 말하고 정말로 있다면 그
셔플을 반복.
[물리 버전 해결] (http://www.kirix.com/extensions/files/2008/08/puzzle-example.png)의 알고리즘을 살펴 보는 것만 큼 어떨까요? –
실제 버전의 이름을 생각할 수 없습니다. 게시 한 사진에 '누락 된 타일'이 있기 때문에 다르게 작동합니다. 내 경우에는 타일을 바꾸지 않고 행이나 열을 회전시킵니다. – avalore
SQL에서 해결할 보너스 포인트 ... – wildplasser