Chuyến du lịch tiếp theo của hiệp sĩ


8

Chúng ta đều đã nghe nói về câu đố Tour của Hiệp sĩ : tìm một tuyến đường cho một hiệp sĩ đi qua tất cả các ô vuông trên bàn cờ. Nhưng hãy thành thật mà nói, nó hơi nhàm chán. Vì vậy, hãy cho hiệp sĩ một chút thử thách.

Bài tập

Viết một chương trình đưa hiệp sĩ đi qua tất cả các ô vuông trên một bàn cờ có kích thước tùy ý, tùy ý. Nó sẽ lấy bàn cờ làm đầu vào và đầu ra tập hợp các nước đi và vị trí bắt đầu. Trong trường hợp có một bảng không thể, nó sẽ xuất ra tập hợp các bước di chuyển và vị trí bắt đầu cho một chuyến tham quan với độ dài dài nhất có thể. Lưu ý: hiệp sĩ không cần phải đi một vòng; giả sử anh ta có một cách khác để về nhà.

Các quân cờ là nhỏ, vì vậy mã của bạn cần phải đủ nhỏ để các hiệp sĩ mang theo.

Đầu vào

Đầu vào sẽ là một đại diện dựa trên chuỗi hoặc dựa trên mảng của bàn cờ, trong đó giá trị không trống / trung thực là một hình vuông và giá trị trống / giả là một khoảng trống. Để đơn giản, tôi sẽ sử dụng #s và s được sắp xếp trong một lưới cho các ví dụ.

Đầu ra

Đầu ra sẽ là hai số nguyên lớn, theo sau là một loạt các số nguyên 4 bit hoặc tương đương với ngôn ngữ của bạn. Hai số nguyên lớn sẽ đại diện cho tọa độ bắt đầu và các số sau sẽ đại diện cho một di chuyển như vậy:

 7 0
6   1
  K
5   2
 4 3

nơi Klà vị trí trước khi di chuyển, và số lượng là vị trí sau khi di chuyển.

Ví dụ

Vì có rất nhiều giải pháp khả thi cho câu đố Tour của Hiệp sĩ, tôi sẽ chỉ cung cấp các kết quả đầu ra mẫu. Có thể có nhiều đầu ra hơn.

###
# #
###
0 0 3 0 5 2 7 4 1

Thử thách mới: Đưa ra nhiều ví dụ


"cho dài nhất" -> "cho một dài nhất?

Bạn đang theo một con đường Hamilton hay một chu kỳ Hamilton?
Peter Taylor

@PeterTaylor Bất cứ ai chơi gôn! Một con đường là tốt; đó là một chu kỳ bởi vì đó là một con đường hợp lệ.
wizzwizz4

Câu trả lời:


2

Toán học, 151 byte

Needs@"Combinatorica`"
{Reverse@#[[1]]-1,3-Floor[1.2Arg[Complex@@@Differences@#]]}&[#[[HamiltonianPath@MakeGraph[#,Norm[#-#2]^2==5&]]]&@Position[#,1]]&

Rõ ràng, HamiltonianPath@MakeGraph[#,Norm[#-#2]^2==5&]làm tất cả các công việc.

Đầu vào là một 2D (0,1) giống như {{0,0,1},{1,1,1},{1,0,1},{1,1,1}}.

Đầu ra trông như thế này: {{2, 0}, {5, 3, 0, 5, 2, 7, 4, 1}}

Tôi không biết nhiều về môn gôn Mathicala, vì vậy hãy thoải mái chỉ ra những cải tiến. Có cách nào tốt hơn để lưu kết quả cá nhân hơn là sử dụng một tỷ hàm thuần túy?

Đã lưu một byte; cảm ơn, MèoAreFluffy.


Bạn có thể áp dụng HamiltonianPath với @.
Máy

2
Câu trả lời này không hợp lệ vì nó không thỏa mãn "Trong trường hợp bảng không thể, nó sẽ xuất tập hợp các bước di chuyển và vị trí bắt đầu cho chuyến tham quan với thời lượng dài nhất có thể."
Bong bó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.