Vấn đề cầm đồ bị mất
Sau khi trò chơi cờ kết thúc, một con tốt còn sống sót bị bỏ lại phía sau quân địch. Hãy giúp anh ta tìm đường về nhà ngắn nhất.
Vấn đề ban đầu mô tả một bàn cờ "cờ vua" và chức năng f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
của trọng số. mục tiêu là tìm ra con đường tốt nhất từ một hình vuông trong đường mông, đến một hình vuông khác ở dòng trên cùng, trong đó các bước di chuyển có thể là: trái, lên, phải, và bạn không thể thoát khỏi bảng.
Vấn đề tương đối dễ giải quyết trong O (n ^ 2) bằng lập trình động, nhưng đây là codegolf và chúng tôi không quan tâm đến những thứ vô dụng như độ phức tạp của thời gian ...
Vấn đề
đầu vào: một mảng 3 chiều (hoặc một số bộ sưu tập khác mà bạn chọn, nhận được thông qua stdin hoặc dưới dạng đối số chức năng), tương ứng với một bàn cờ thông thường, có kích thước chính xác: 7X8X3 (#linePasses X #rowSize X #movePerPass) có chứa số nguyên không âm. chi phí di chuyển từ một số vị trí (i,j)
trong đó i
là chỉ mục hàng và j
là chỉ mục cột, là:
a[i][j][0]
cho chi phí để di chuyển từ trái sang vuông(i+1,j-1)
hoặc đồ họa :\
.a[i][j][1]
cho chi phí để đi lên đến hình vuông(i+1,j)
, hoặc đồ họa :|
.a[i][j][2]
cho chi phí để di chuyển từ phải sang vuông(i+1,j+1)
hoặc đồ họa :/
.
bạn có thể cho rằng nó sẽ không chứa một đường dẫn tổng lớn hơn MAX_INT
.
đầu ra: đầu ra 8X8 ascii hiển thị đường dẫn tốt nhất (ngắn nhất, tức là tổng trọng số tối thiểu) (nếu có nhiều hơn 1 kết quả tối ưu, bạn có thể hiển thị đường dẫn tùy ý của mình). đường dẫn được vẽ từ dưới lên trên, trong đó trong mỗi dòng, ký tự tương ứng với vị trí cầm đồ trong đường dẫn, là ký tự mà nó sắp thực hiện. ví dụ: nếu con tốt sắp di chuyển sang trái từ cột 3 (sang cột 2), bạn nên vẽ:
#?######
##\#####
nơi ?
nên được thay thế với di chuyển tiếp theo. vị trí cuối cùng cần phải được rút ra là X
.
Ví dụ
đầu vào:
[
[[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]]
]
đầu ra:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
đầu vào:
[
[[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]]
]
đầu ra:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
Đây là môn đánh gôn , vì vậy đoạn mã ngắn nhất sẽ thắng.
chơi sòng phẳng. không sơ hở ...
BIÊN TẬP:
Iv'e đã viết một giải pháp chuyển tiếp thẳng không chơi gôn trong scala mà bạn có thể nhìn vào. Ngoài ra còn có một trang web bạn có thể chơi với mã scala trên mạng: scalakata (chỉ cần sao chép và dán ý chính vào scalakata và nhấn nút play)