Thử thách này là về việc chuyển đổi mê cung 2D thành mê cung 1D.
Tổng quan
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | |A| | B| A B A -- D
+ + + + +-+-+ + + + + +-+-+ \ | C -- D
| | | | | | | | \ | D -- E
+-+-+ +-+-+ + +-+-+ +-+-+ + \ | E -- F
| | |C D E F| C---D-E---F E -- G
+-+-+-+ +-+ + +-+-+-+ +-+ + | | B -- F
| | | | G | | .---G | F -- J
+ +-+-+-+ + + + +-+-+-+ + + .' / | G -- H
| | | | |H|I |J| H I-' J G -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 1 Figure 2 Figure 3
Với mục đích của thử thách này, một mê cung 2D truyền thống là một mê cung hình chữ nhật được hình thành từ các điểm mạng trong đó tất cả các điểm sau:
- Nó được đóng lại (vành ngoài được kết nối bởi các bức tường).
- Tất cả các điểm mạng được kết nối với các bức tường
- Nó được kết nối (cứ hai không gian X và Y có một đường dẫn giữa chúng)
- Đó là chu kỳ (không có đường dẫn từ bất kỳ khoảng trắng nào trở lại X mà không quay lại)
Hình 1 cho thấy một mê cung 2D truyền thống. Những mê cung này có ba lĩnh vực quan tâm:
- Ngõ cụt - những nơi chỉ có một con đường có sẵn
- Hành lang - nơi có hai lối đi có sẵn
- Điểm quyết định - nơi có ba hoặc bốn đường dẫn có sẵn
Đối với mỗi mê cung như vậy, người ta có thể tạo một biểu đồ trong đó điểm chết và điểm quyết định là các nút và có một cạnh giữa mỗi hai nút được kết nối bằng một đường dẫn dọc theo hành lang. Hình 2 cho thấy cùng một mê cung với các nút như vậy được dán nhãn và Hình 3 biểu đồ của mê cung (theo ký hiệu dấu chấm ASCII và Graphviz).
Mê cung 1D
Mê cung 1D kết hợp các điểm cong vênh, đi theo cặp và được xác định bằng một chữ cái (trong cả hai trường hợp). Hình 4 cho thấy một mê cung ví dụ 1D. Điều này giống hệt với mê cung 2D có chiều cao bằng 1, như trong Hình 5. Đặc biệt lưu ý trong Hình 5, các vị trí điểm lưới được đánh dấu bởi +
, thay thế từ trái sang phải; trong mê cung 1D, mọi nhân vật khác bắt đầu bằng bức tường ngoài cùng bên trái cũng là một điểm lưới.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| D| D E|G E F| F | G | | D| D E|G E F| F | G |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4 Figure 5
Các quy tắc để điều hướng mê cung này là như sau. Mọi di chuyển có thể được biểu diễn dưới dạng tiến ( >
) hoặc lùi ( <
). Chuyển tiếp và lùi ở đây theo mặc định có cùng ý nghĩa với nhận thức không gian trực quan của chúng tôi; về phía trước đi đến vị trí ngay bên phải, và ngược lại ngay bên trái.
Điểm Warp đại diện cho các vị trí trao đổi kết nối không đối xứng với hàng xóm. Nếu bạn đến từ một người hàng xóm đến một điểm cong vênh, vị trí của hai điểm cong sẽ bị tráo đổi; nếu bạn đến từ một điểm dọc đến một người hàng xóm, họ sẽ không bị tráo đổi. Ví dụ, trong Hình 6, di chuyển ngược từ 1 đưa bạn đến 2 (vì 1 là hàng xóm của G và chúng tôi đang di chuyển từ hàng xóm, các điểm 2 và @ được hoán đổi). Tiến về phía trước từ 2 (điểm warp G) đưa bạn đến 3 (ở đây, chúng tôi đang bắt đầu từ một điểm warp, vì vậy không có trao đổi). Tương tự như vậy, di chuyển ngược từ 3 đưa bạn đến @.
54 2367 89^ @1
| D| D E|G E F| F | G |
Y X
Figure 6
Hình 6 cũng cho thấy một điều hướng ví dụ từ X đến Y, sử dụng chuỗi các bước di chuyển <<>><>>>>>
. Những động tác này đưa bạn đến các điểm được dán nhãn 123456789^
tương ứng, theo thứ tự đó. Hãy tự mình khám phá nó bằng cách sử dụng đoạn mã trong phần tiếp theo.
Chuyển đổi 2D thành 1D
Với một mê cung 1D, người ta có thể tạo một biểu đồ trong đó mỗi nút là một ngõ cụt hoặc một cặp điểm dọc và các cạnh tồn tại giữa bất kỳ hai nút nào được kết nối dọc theo một hành lang. Biểu đồ này cho phép chúng ta so sánh các mê cung 1D và 2D.
Ví dụ, mê cung 1D trong Hình 4 là mê cung tương tự trong Hình 1. Để xem tại sao, Hình 7 thêm nhãn vào ngõ cụt. Sử dụng các nhãn đó để xây dựng biểu đồ, biểu đồ của Hình 7 chỉ đơn giản là Hình 3 một lần nữa. Hình 8 cho thấy một đột phá của việc xây dựng biểu đồ này.
| D| D E|G E F| F | G |
A C B J H I
Figure 7
| D| D E|G E F| F | G |
+ + + + + + + + + + + + + + + <- lattice points
|A |C | |B J|H I| <- dead ends
|A D|C D E|G E F|B F J|H G I| <- all nodes (dead ends+warp points); i.e.:
"where each end is either a dead end
or a warp point pair"; note that each
pair of warp points is the same node.
|A-D|C-D-E|G-E-F|B-F-J|H-G-I| <- corridors; note each is a connection, since
1 2 3 4 5 6 7 8 9 "edges exist between any two nodes
connected along a corridor"
graph { graph {
A -- D // 1 <----> A -- D
C -- D // 2 <----> C -- D
D -- E // 3 <----> D -- E
G -- E // 4 <----> E -- G
E -- F // 5 <----> E -- F
B -- F // 6 <----> B -- F
F -- J // 7 <----> F -- J
H -- G // 8 <----> G -- H
G -- I // 9 <----> G -- I
} ^ }
Built from | From Figure 3
1D maze `-> isomorphic mappings
Figure 8
(Lưu ý rằng các nhãn và bố cục của mỗi biểu đồ được chọn một cách giả tạo để căn chỉnh cho mục đích minh họa; nói chung đây là một vấn đề đẳng cấu đồ thị ).
Đoạn mã sau được cung cấp để giúp trực quan hóa cơ chế của mê cung 1D và kết nối giữa mê cung 1D, biểu đồ tương đương và mê cung 2D.
Khi bạn điều hướng mê cung 1D trong đoạn trích này, hai nút cuối cùng bạn chạm vào sẽ được tô sáng. Các nút giống nhau được tô sáng theo cùng một cách trên biểu đồ tương đương và mê cung 2D.
Nói chung, đối với bất kỳ mê cung 2D truyền thống nào cũng có thể tạo ra mê cung 1D tương đương thuộc loại này. Một ví dụ phức tạp hơn một chút là Hình 9:
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | | |A| | |B| A B A -- D
+ + + + + + + + + + + + + + \ / C -- D
| | | | | | | | | | \ / D -- E
+-+-+ + +-+-+ +-+-+ + +-+-+ \ / B -- E
| | |C D E | C---D-E E -- F
+-+-+-+ +-+ + +-+-+-+ +-+ + |\ E -- I
| | | | F | | .---F \ F -- G
+ +-+-+-+ + + + +-+-+-+ + + .' / \ G -- H
| | | | |G|H |I| G H-' I H -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 9 Figure 10 Figure 11
| D| D E |F E | F | | D| D E |F E | F |
A C I B G H
Figure 12 Figure 13
Mê cung này có một nút có bốn đường dẫn (E trong Hình 10). Hình 11 cho thấy biểu đồ của nó. Hình 12 là một mê cung 1D tương đương; và Hình 13 cho thấy cùng một mê cung với các nhãn cho ngõ cụt để so sánh với Hình 11.
Thử thách
Đưa ra một Mê cung 2D làm đầu vào, hãy viết một hàm hoặc chương trình biến đổi mê cung 2D thành mê cung 1D với các điểm cong vênh. Điểm Warp có thể sử dụng bất kỳ trong số 52 chữ cái trong mỗi trường hợp.
Đảm bảo đầu vào (nếu bất kỳ điều nào trong số này không được đáp ứng trong đầu vào mà bạn không phải đối phó với nó):
- Mê cung đầu vào được kết nối (nghĩa là bạn luôn có thể đi từ bất kỳ vị trí nào đến bất kỳ vị trí nào khác).
- Mê cung đầu vào được đóng lại.
- Mê cung đầu vào là hình chữ nhật.
- Tất cả các điểm mạng sử dụng
+
. - Tất cả các bức tường giữa các điểm lưới trên cùng một hàng sử dụng
|
- Tất cả các bức tường giữa các điểm lưới trong cùng một cột sử dụng
-
. - Tất cả các không gian là một phần của một con đường (và tất cả bên trong mê cung).
- Đường dẫn là tất cả các không gian (điều này sẽ luôn là truyền thống, không cong vênh)
- Đường dẫn chính xác là một không gian rộng.
- Mê cung được xây dựng bằng cách kết nối các điểm trên một mạng tinh thể.
- Không có hơn 52 nút tổng (nghĩa là điểm chết cộng với điểm quyết định) trong biểu đồ của mê cung.
Định dạng đầu ra:
- Đầu ra của bạn phải là một dòng duy nhất hiển thị mê cung 1D.
- Đầu ra của bạn không nên có khoảng trắng hàng đầu / dấu; ngoại trừ một dòng mới là tốt.
- Ký tự đầu tiên và mọi ký tự khác sau đó là các điểm mạng.
- Tất cả các bức tường nên được trên các điểm lưới; và tất cả các điểm cong vênh giữa chúng.
- Biểu đồ của mê cung 1D của bạn phải tương đương với biểu đồ của mê cung 2D.
- Mê cung 1D của bạn phải nhỏ gọn; tất cả các điểm không phải mạng tinh thể phải là ngõ cụt (nghĩa là liền kề với các bức tường) hoặc các điểm cong vênh.
- Các chữ cái duy nhất trong đầu ra của bạn phải là các điểm cong vênh. Mỗi điểm cong vênh xảy ra trên dòng chính xác hai lần.
Thí dụ:
| D| D E|G E F| F | G | <- (1,2) The single line output
+ + + + + + + + + + + + + + + <- lattice point spacing... (3)
(4,6) lattice points are all walls or spaces
(5) See Figure 8
(7) D, E, F, G appear twice; no other labels
Đây là mã golf. Người chiến thắng là bài nộp không kẽ hở chính xác với ít byte nhất.
Kiểm tra
Không có trường hợp thử nghiệm cho thử thách này, vì có một số lượng lớn đầu ra chính xác cho bất kỳ mê cung không tầm thường nào.
Tuy nhiên, tôi đã xây dựng một trình kiểm tra trong C ++ (trình kiểm tra này biểu đồ cả hai giải pháp thông qua việc chuẩn hóa biểu đồ ).
Ngoài ra, đây là một vài ví dụ để giúp minh họa định dạng phù hợp:
ví dụ 1
+-+-+-+-+-+-+
| | | |
+ + + + +-+-+
| | | |
+-+-+ +-+-+ +
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E|G E F| F | G |
Ví dụ 2
+-+-+-+-+-+-+
| | | | |
+ + + + + + +
| | | | |
+-+-+ + +-+-+
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E |F E | F |