Thu hồi trượt


9

Cảm ơn Bác (truyện)

Người chú hơi điên của tôi gần đây đã rời khỏi các thuộc địa không gian, và chuyển giao việc kinh doanh hàng hóa pallet của mình cho tôi. Kho hình chữ nhật chứa đầy các pallet hàng hóa ngoại trừ một ô vuông cạnh cửa và tôi vừa nhận được danh sách pallet đầu tiên do khách hàng đặt mua hôm nay.

May mắn thay, tôi có một bản đồ được viết cẩn thận về vị trí của mỗi pallet, và người chú điên của tôi đã thiết kế một số robot nhỏ có thể di chuyển một pallet vào một không gian liền kề, giống như một câu đố trượt 15. Mặc dù vậy, tôi không quan tâm nơi các pallet kết thúc, tôi chỉ muốn các pallet trong danh sách đến theo thứ tự ở cửa.

Câu hỏi là, tôi phải cung cấp chuỗi lệnh nào cho các robot để lấy các palet cần thiết?

Các thách thức

Được

  • kích thước của lưới (hàng, cols)
  • một danh sách các pallet (theo vị trí hiện tại của chúng) để lấy theo thứ tự

Bạn phải xuất danh sách các vị trí lưới tương ứng với vị trí sẽ được di chuyển và hướng nào. Nếu chỉ có 1 hướng khả dụng, bạn có thể tùy ý bỏ qua hướng đó. Các pallet sẽ được gỡ bỏ ngay khi đến cửa (tại một góc, chỉ số N trong các ví dụ).

Ví dụ làm việc

01 02   label the contents  A B
03 04                       C D
05[  ]                      E _

Request: 03 (contents is C)

Command 0: 04
D moves into the (only) adjacent space at index 06
Result: A B
        C _
        E D

Command 1: 03
C moves into the (only) adjacent space at index 04
Result: A B
        _ C
        E D

Command 2: 05
        A B
        E C
        _ D
Command 3: 06  
        A B
        E C
        D _
Command 4: 04
        A B
        E _
        D[C]
(C removed having arrived by the door)

Giới hạn và quyền tự do

  • Kích thước lưới tối đa là 100x100
  • Thử thách là chơi gôn
  • Giải pháp phải thực hiện trong vòng 2 phút trên một số máy trong thế giới thực
  • Bạn có thể chọn lập chỉ mục, cú pháp lệnh, cấu trúc đầu vào, v.v, miễn là nó phù hợp.
  • Tôi đã chọn sử dụng các vị trí lưới cho các lệnh, nhưng có thể hình dung bạn có thể phát ra giá trị trong phần tử thay vào đó (cộng với một hướng) vì chúng là duy nhất.
  • Nếu bạn muốn tạo một hình ảnh động của trạng thái (đặc biệt là cho một lưới lớn), tôi chắc chắn rằng nó sẽ rất thú vị!

Ví dụ

A: 3x2, 1 pallet

01  02
03  04
05 [__]

Request: pallet at 03

Valid solution: 05,03,04,06,05

This leaves the following state:

01  02
04  05
__ [03]

B: 15 câu đố, 1 hộp

01 02 03 04 05
06 07 08 09 10
11 12 13 14[  ]

Request: box 01

Valid solution: 14,13,12,11,06,01,02,07,12,11,06,07,12,11,06,07,08,13,12,11,06,07,08,09,14,13,08,09,10,15,14

02 07 03 04 05
08 12 13 10 14
06 11 09 __[01]

C: 3x2, 4 hộp

01 02
03 04
05[  ]

Request: 02,04,01,05

Valid solution: 04,02,01,03,05,06,04,05,02,06,03S,05E
Pallet taken at:                    ^  ^     ^       ^

Indicating directions with NSEW

Final state:

03 __
__ __
__ __

D: 10 x 10, 2 hộp

10x10, request boxes at 13,12 (row 1, cols 2 & 1 with 0-index)

Valid solution: (90,80..20, 19,18..12, 22,32..92, 93,94..100) x 15, 90.

E: 4x1, tất cả

4x1: 01 02 03 [ ]
Req: 03,02,01 (only valid order)
Optimal solution: 03,02,03E,01,02E,03E

F: 100x100, 3 gần cửa

100x100
Req: 9900,9899,9898
Result: 9000,9989,9000S,9898,9898E,9000S

Liên kết hộp cát


nếu hộp 2 và 3 được yêu cầu, việc 3 người đi qua cửa có bất hợp pháp không khi bạn di chuyển 2 về phía cửa?
Giô-na

1
@Jonah: Không, hoặc không có kịch bản nào có thể giải quyết được trừ khi hộp đầu tiên là n-1 hoặc nc. Điều duy nhất đặc biệt về không gian cạnh cửa là khi pallet tiếp theo trong danh sách đến đó, nó sẽ bị loại bỏ ngay lập tức bởi người điều khiển xe nâng lập dị của tôi.
Phil H

Câu trả lời:


3

JavaScript (Node.js) - 425 424 420 395

(n,m,L)=>(s=Math.sign,G=[...Array(n*m).keys()],i=k=n*m-1,G[k]=-1,R=[],M=j=>{-G[j]-1&&R.push([j,i]);[G[i],G[j]]=[G[j],G[i]];i=j},X=j=>{while(i%n-j%n)M(i+s(j%n-i%n))},Y=j=>{while(y(i)-y(j))M(i+n*s(y(j)-y(i)))},y=i=>(i-i%n)/n,L.map(e=>{J=()=>j=G.indexOf(e);while(J()%n-n+1){m>1&&y(j)-y(i)||M(y(i)?i-n:i+n);X(j+1);Y(j);M(j);m<2?i=k:0}while(J()+1-n*m){X(n-2);Y(j+n);X(n-1);M(j);n<2?i=k:0}G[k]=-1}),R)

Hãy thử trực tuyến!

Lấy n, m và một mảng các palet, trả về một danh sách các lệnh trong đó mỗi lệnh là một mảng 2 phần tử của vị trí của palet để di chuyển và vị trí của không gian để di chuyển nó đến.

Có lẽ có một chiến lược tốt hơn những gì tôi đã sử dụng, nhưng hiện tại vẫn đang đăng.

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.