Vẽ tam giác Sierpinki đã được thực hiện cho đến chết . Có những điều thú vị khác chúng ta có thể làm với nó mặc dù. Nếu chúng ta nheo mắt đủ cứng tại tam giác, chúng ta có thể xem các tam giác lộn ngược như các nút của đồ thị fractal. Hãy tìm cách của chúng tôi xung quanh biểu đồ đó!
Đầu tiên, hãy gán một số cho mỗi nút. Tam giác lộn ngược lớn nhất sẽ là nút 0, và sau đó chúng ta chỉ đi xuống từng lớp (chiều rộng đầu tiên), gán các số liên tiếp theo thứ tự trên cùng bên trái:
Nhấp vào để xem phiên bản lớn hơn trong đó các số nhỏ sẽ mờ hơn một chút.
(Tất nhiên, mô hình này tiếp tục vô cùng tận bên trong tam giác màu xanh.) Một cách khác để xác định việc đánh số là các nút trung tâm có chỉ số 0
, và các con của nút i
(hình tam giác liền kề của quy mô tiếp theo nhỏ hơn) có chỉ số 3i+1
, 3i+2
và 3i+3
.
Làm thế nào để chúng ta di chuyển xung quanh biểu đồ này? Có tối đa sáu bước tự nhiên người ta có thể thực hiện từ bất kỳ tam giác nào:
- Người ta luôn có thể di chuyển qua điểm giữa của một trong các cạnh đến một trong ba phần tử con của nút hiện tại. Chúng tôi sẽ chỉ định những động thái này là
N
,SW
vàSE
. Ví dụ, nếu chúng ta hiện đang ở trên nút2
, những sẽ dẫn đến các nút7
,8
,9
, tương ứng. Các di chuyển khác qua các cạnh (đến hậu duệ gián tiếp) không được phép. - Người ta cũng có thể di chuyển qua một trong ba góc, với điều kiện nó không chạm vào cạnh của tam giác, với cha mẹ trực tiếp hoặc một trong hai tổ tiên gián tiếp. Chúng tôi sẽ chỉ định những động thái này là
S
,NE
vàNW
. Ví dụ: nếu chúng tôi hiện đang ở trên nút31
,S
sẽ dẫn đến10
,NE
sẽ không hợp lệ vàNW
sẽ dẫn đến0
.
Các thách thức
Cho hai số nguyên không âm x
và y
, tìm đường đi ngắn nhất từ x
đến y
, chỉ sử dụng sáu động tác được mô tả ở trên. Nếu có một vài đường dẫn ngắn nhất, hãy xuất bất kỳ một trong số chúng.
Lưu ý rằng mã của bạn sẽ hoạt động không chỉ cho 5 cấp độ được mô tả trong sơ đồ trên. Bạn có thể cho rằng x, y < 1743392200
. Điều này đảm bảo rằng chúng vừa với số nguyên có chữ ký 32 bit. Lưu ý rằng điều này tương ứng với 20 cấp độ của cây.
Mã của bạn phải xử lý bất kỳ đầu vào hợp lệ nào trong vòng chưa đầy 5 giây . Mặc dù điều này loại trừ một tìm kiếm đầu tiên theo chiều rộng, nó phải là một ràng buộc khá lỏng lẻo - việc triển khai tham chiếu của tôi xử lý đầu vào tùy ý cho độ sâu 1000 trong nửa giây (đó là ~ 480 chữ số cho các nút).
Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
Sản lượng nên được một căn hộ, danh sách rõ ràng của chuỗi N
, S
, NE
, NW
, SE
, SW
, sử dụng bất kỳ phân cách hợp lý (không gian, linefeeds, dấu phẩy, ","
...).
Luật golf tiêu chuẩn được áp dụng.
Các trường hợp thử nghiệm
Một vài trường hợp thử nghiệm đầu tiên có thể được xử lý bằng tay bằng cách sử dụng sơ đồ trên. Những người khác đảm bảo rằng câu trả lời là đủ hiệu quả. Đối với những người, có thể có các giải pháp khác có cùng độ dài không được liệt kê.
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE