Lấy cảm hứng từ câu hỏi này
Một cách khác để hủy hình ảnh 2D thành chuỗi 1D là sử dụng Hilbert Curve.
Có nhiều phiên bản của đường cong này, tùy thuộc vào số lần lặp được sử dụng trong khi tính toán nó. Dưới đây là ví dụ về Hilbert Curves từ đơn hàng đầu tiên đến đơn hàng thứ năm.
Cách tính đường cong này là như sau. Đầu tiên, chúng tôi xác định thứ tự đầu tiên Hilbert Curve là thứ tự được hiển thị trong hình (một cho n = 1), sao cho nó khớp với hình vuông 1x1. Chúng tôi hơn là tạo ra bốn bản sao của đường cong này, đặt chúng trong một hình vuông 4 x 4, sao cho tất cả chúng đều thể hiện "độ chụm" về phía bên trái. Sau đó, chúng ta lật hai đường cong thứ tự ngoài cùng bên trái 1, sao cho phần trên cùng của mặt phải hướng về phía trên, trong khi phần dưới cùng hướng về phía dưới. Cuối cùng chúng tôi kết nối các góc của Hilbert Curves liền kề. Nếu muốn có được Đường cong thứ tự (n + 1), chúng ta chỉ cần lặp lại quy trình với bốn Đường cong thứ tự n. Chúng ta có thể thấy một hình ảnh trực quan của quá trình ở đây (tôi cũng sẽ thêm một hình ảnh chi tiết quá trình này sớm)
Nhiệm vụ của bạn trong thử thách này là hủy bỏ một ma trận các số nguyên dọc theo đường cong Hilbert bậc thấp nhất cho ma trận đó.
Để đơn giản, chúng ta sẽ có đường cong bắt đầu từ góc trên cùng bên trái của ma trận.
Bạn có thể nhận đầu vào dưới dạng danh sách các số nguyên, trong đó mỗi danh sách phụ đại diện cho một hàng của ma trận.
Bạn có thể giả sử rằng đầu vào sẽ là một ma trận vuông (n * n).
Ví dụ:
Đầu vào:
[[ 1, 2,]
[ 3, 4 ]]
Đầu ra:
[ 1, 2, 4, 3 ]
Vì chúng ta đang sử dụng thứ tự đầu tiên Hilbert Curve được hiển thị trong hình
Đầu vào:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Đầu ra:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Sử dụng lệnh thứ hai Hilbert Curve
Như thường lệ, sơ hở tiêu chuẩn không được phép.
Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất trong byte thắng.