Một nhu cầu rất phổ biến trong các lớp thuật toán và khoa học máy tính nói chung là lặp 4 hướng trên một lưới hoặc ma trận (chẳng hạn như trong BFS hoặc DFS). Điều này dường như thường dẫn đến rất nhiều mã lộn xộn và dài dòng với rất nhiều số học và so sánh trong các vòng lặp. Tôi đã thấy nhiều cách tiếp cận khác nhau về vấn đề này, nhưng tôi không thể lay chuyển được cảm giác rằng có một cách ngắn gọn hơn để làm điều này.
Thách thức là viết một hàm thuần túy, với chiều rộng và chiều cao của mặt phẳng hữu hạn n, m
có nguồn gốc tại điểm (0,0)
và tọa độ (x,y)
có thể biểu thị bất kỳ điểm hợp lệ nào trong mặt phẳng đó, trả về một đối tượng có thể lặp lại của tất cả các điểm trong mặt phẳng 4 hướng Liền kề (x,y)
.
Mục tiêu là xác định hàm đó theo càng ít byte càng tốt.
Một số ví dụ để giúp minh họa đầu vào / đầu ra hợp lệ:
n = 5 (y-axis), m = 3 (x-axis) (zero-based)
matrix = [
[A, B, C],
[D, E, F],
[G, H, I],
[J, K, L],
[M, N, O],
]
(x, y) => [valid iterable points]
E: (1, 1) => [(1, 0), (2, 1), (1, 2), (0, 1)]
A: (0, 0) => [(1, 0), (0, 1)]
L: (2, 3) => [(2, 2), (2, 4), (1, 3)]
N: (1, 4) => [(1, 3), (2, 4), (0, 4)]
n = 1 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
]
(x, y) => [valid iterable points]
A: (0, 0) => []
n = 2 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
[B],
]
(x, y) => [valid iterable points]
A: (0, 0) => [(0, 1)]
B: (0, 1) => [(0, 0)]
Và đây là một ví dụ (ví dụ này trong Python) của một hàm thỏa mãn các điều kiện:
def four_directions(x, y, n, m):
valid_coordinates = []
for xd, yd in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
nx, ny = x + xd, y + yd
if 0 <= nx < m and 0 <= ny < n:
valid_coordinates.append((nx, ny))
return valid_coordinates
Ví dụ trên đã định nghĩa một hàm được đặt tên, nhưng các hàm ẩn danh cũng được chấp nhận.
Các đầu vào n, m, x, y
là tất cả các số nguyên 32 bit không dấu trong các phạm vi sau:
n > 0
m > 0
0 <= x < m
0 <= y < n
Đầu ra phải có dạng lặp (tuy nhiên ngôn ngữ bạn chọn xác định) của các cặp (x, y).
Làm rõ thêm:
Các số phức (và các biểu diễn / tuần tự hóa khác) đều được miễn là người tiêu dùng của iterable có thể truy cập x
và y
như các số nguyên chỉ biết vị trí của chúng.
Các chỉ mục dựa trên không có thể được chấp nhận, nhưng chỉ khi ngôn ngữ được lựa chọn là ngôn ngữ có chỉ số khác không. Nếu ngôn ngữ sử dụng kết hợp các hệ thống đánh số, mặc định là hệ thống đánh số của cấu trúc dữ liệu được sử dụng phổ biến nhất để biểu diễn một ma trận. Nếu đây vẫn là tất cả các khái niệm nước ngoài trong ngôn ngữ nhất định, bất kỳ chỉ số bắt đầu nào cũng được chấp nhận.
(x,y)
nó nằm trong hình chữ nhật, phải không?