잃어버린 폰 문제
체스 게임이 끝난 후 살아남은 폰이 적의 선 뒤에 남았습니다. 집으로 돌아가는 가장 짧은 길을 찾도록 도와주세요.
원래 문제는 nXn "체스"보드와 f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
무게 의 기능 을 설명합니다 . 목표는 왼손, 오른손, 오른손, 왼쪽으로 올라가서 왼쪽으로 올라갈 수있는 가장 좋은 길을 찾는 것입니다.
동적 프로그래밍을 사용하여 O (n ^ 2)에서 문제를 해결하는 것은 비교적 쉽지만 이것은 코드 골프이며 실행 시간 복잡성과 같은 쓸모없는 것들에 대해서는 신경 쓰지 않습니다.
문제
입력 : 일반 체스 보드에 해당하는 3 차원 배열 (또는 선택한 다른 컬렉션, stdin을 통해 받거나 함수 인수로) : 정확히 7X8X3 (#linePasses X #rowSize X #movesPerPass) 음이 아닌 정수 움직임 비용 에서 어떤 위치 행 인덱스이며, 이고, 열 인덱스이다 :(i,j)
i
j
a[i][j][0]
왼쪽에서 정사각형(i+1,j-1)
또는 그래픽 으로 이동하는 비용 :\
.a[i][j][1]
비용을 정사각형(i+1,j)
또는 그래픽 으로 여행하는 경우 :|
.a[i][j][2]
오른쪽에서 정사각형(i+1,j+1)
또는 그래픽 으로 이동하는 비용 :/
.
보다 큰 경로를 포함하지 않는다고 가정 할 수 있습니다 MAX_INT
.
출력 : 최상의 (가장 짧은, 즉 최소 가중치 합계) 경로를 나타내는 8X8 ASCII 출력 (최적의 결과가 둘 이상인 경우 원하는 임의의 경로를 표시 할 수 있음). 패스는 아래에서 위로 그려지며, 각 라인에서 패스에서 폰의 위치에 해당하는 캐릭터가 만들어 질 캐릭터입니다. 예를 들어, 폰이 3 열에서 2 열로 왼쪽 위로 이동하려는 경우 다음을 그려야합니다.
#?######
##\#####
여기서 ?
다음 이동으로 대체해야합니다. 최종 위치는로 그려 져야합니다 X
.
예
입력:
[
[[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
]
산출:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
입력:
[
[[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
[[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
[[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
[[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
[[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
[[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
[[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]
산출:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
이것은 code-golf 이므로 가장 짧은 코드가 승리합니다.
정정당당하게 경기하다. 허점 없음 ...
편집하다:
나는 당신이 볼 수 있는 스칼라에 골프가없는 직선형 솔루션을 작성 했습니다. :이 당신이 온라인 스칼라 코드와 함께 재생할 수있는 사이트이기도 scalakata (scalakata 그냥 복사 & 붙여 넣기 요점은, 및 재생 버튼을 누르면)