Vấn đề cầm đồ bị mất


14

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 đó ilà chỉ mục hàng và jlà 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à , 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)

Câu trả lời:


5

Q: 199 byte

f:{m::x;n::{@/[+/-1 0 1_\:/:(x;m[y;;|!3]);0 2;(0W,),{x,0W}]};i:*<*|r:{&/n[x;y]}\[8#0;!7];  s:{-1+{*<x}'+n[y;z]}\[();(,8#0),-1_r;!7];j:i,{x+y x}\[i;|s];-1(@[8#"#";;:;]'[j;"X","/|\\"1+s'[|!7;-1_j]]);}

GHI CHÚ

  • Trình thông dịch Q (kx.com) miễn phí cho sử dụng không giao dịch (phiên bản cho Windows, Linux, Mac)
  • Giải pháp này sử dụng lõi bên trong của Q (tên nội bộ là k4), vì vậy chúng tôi cần một tệp kịch bản có phần mở rộng k hoặc trình thông dịch tương tác ở chế độ k (lệnh \ tại dấu nhắc đầu tiên). Ngược lại, phiên bản 'verbose' (dễ đọc) của ngôn ngữ yêu cầu tập lệnh có phần mở rộng q và là chế độ mặc định tại trình thông dịch tương tác.

KIỂM TRA

f ((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#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

f ((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#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

GIẢI TRÌNH

Đối với mục đích ilustration, chúng tôi giả định thử nghiệm thứ hai (ma trận ((41 27 38; 12 83 32; ....)

Chúng tôi chuyển đổi ma trận gốc (m ở cấp mã): thay vì ma trận gốc bằng một bộ ba cho mỗi tọa độ, chúng tôi xác định ma trận cho các chuyển vị trái, lên và phải. Ma trận bên trái chứa các giá trị 7x7 (chúng tôi thả cột đầu tiên), ma trận lên 7x8 và ma trận bên phải 7x7 (chúng tôi frop cột cuối cùng).

left                           up                         right
12 50 46 55 75 2  8       27 83 53 32 89 30 11 55     38 32 35 26 82 87 64
83 43 56 68 99 94 62      21 25 75 60 55 48 30 62     0  38 63 77 89 67 9 
24 96 71 75 93 23 49      18 47 45 6  63 56 31 34     40 61 72 48 98 51 30
62 32 68 62 4  97 91      47 79 28 61 39 17 85 18     42 72 44 55 57 49 6 
32 12 33 60 29 70 63      50 39 82 88 55 78 11 94     11 56 23 87 22 14 42
27 70 55 95 87 81 38      64 79 72 45 67 93 36 22     60 86 56 32 12 98 53
77 59 64 41 62 92 26      80 71 46 71 19 71 80 74     50 22 86 53 95 22 41

Để tính toán vị trí cuối cùng, chúng ta cần đánh giá đường dẫn chi phí tối thiểu. Chúng tôi giả sử chi phí ban đầu 0 0 0 0 0 0 0 0 (chi phí để đến từng cột của hàng đầu tiên) và lặp lại với mỗi hàng tiếp theo. Tại mỗi cột i, chúng tôi tính toán ba giá trị:

  • chi phí của giá trị i + 1 trước đó cộng với [i + 1]. Chúng tôi bỏ thành phần đầu tiên của chi phí (các ca làm việc và thay đổi cột để thêm) và tổng thành phần cho thành phần

  • chi phí của giá trị i trước đó cộng với [i]. Chúng tôi tổng hợp thành phần thành phần

  • chi phí của giá trị i-1 trước đó cộng với quyền [i-1]. Chúng tôi bỏ thành phần cuối cùng của chi phí (các ca làm việc và thay đổi cột để thêm) và tổng thành phần cho thành phần

Để tính toán tối thiểu, chúng tôi hoàn thành chi phí bên trái vô hạn và chi phí bên phải nối thêm vô hạn: với 3 vectơ gồm tám thành phần, tính toán thành phần tối thiểu cho thành phần. Giá trị kết quả là chi phí cơ bản cho lần lặp mới

Đối với lần lặp đầu tiên, chúng tôi thu được các giá trị (0W là vô hạn trong Q)

0W 12 50 46 55 75 2  8
27 83 53 32 89 30 11 55
38 32 35 26 82 87 64 0W

và tính toán tối thiểu của mỗi cột

27 12 35 26 55 30 2 8

Sau tất cả các lần lặp, chúng tôi có chi phí tối thiểu để đến từng ô vuông (giả sử hàng 0 ở trên cùng, 7 ở dưới cùng). Chúng tôi chỉ quan tâm đến cột cuối cùng, nhưng tôi rút ra tất cả các kết quả trung gian cho các mục đích phi lý

0   0   0   0   0   0   0   0
27  12  35  26  55  30  2   8
27  37  78  82  110 78  11  70
45  61  123 88  173 129 34  104
87  123 151 143 212 133 40  122
98  155 163 176 234 147 51  185
158 182 219 208 246 234 87  207
208 204 265 261 265 256 128 233

Bây giờ chúng tôi tìm thấy giá trị tối thiểu ở hàng cuối cùng (128, tại cột 6). Đó là kết thúc của con đường (ký tự X trong ouput).

Chúng tôi lặp lại tính toán chi phí một lần nữa, nhưng bây giờ chúng tôi chú thích hướng từ chúng tôi đạt được từng mức tối thiểu (trong 3 giá trị được sử dụng để tính toán tối thiểu là giá trị được chọn).

\|/|\///
\\\\\/|/
\\\|//|/
\\|\//|/
\\|//|\/
\\//|\|/
\|/|/|\/

Chúng tôi đảo ngược các hàng, đặt 'X' ở vị trí 6 và chỉ bảo toàn đường dẫn kết thúc ở cột 6 (các đường khác được thay thế bằng #)

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

Iv'e chưa bao giờ nghe về Q, nhưng cảm ơn vì đã trả lời chi tiết như vậy :)
gilad hoch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.