通常,算法类和计算机科学中非常普遍的需求是在网格或矩阵上(例如在BFS或DFS中)对4方向进行迭代。这似乎经常导致大量笨拙和冗长的代码,并且在循环内进行了大量的算术和比较。我已经看到了许多不同的方法,但是我无法撼动这种简单的方法。
面临的挑战是编写一个纯函数,给定一个有限平面的宽度和高度,该平面n, m
起源于point (0,0)
,并且坐标(x,y)
可以表示该平面内的任何有效点,返回平面内所有点的4方向可迭代对象毗邻(x,y)
。
目的是在尽可能少的字节中定义该功能。
一些示例可帮助说明有效的输入/输出:
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)]
这是一个满足条件的函数的示例(此示例在Python中):
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
上面的示例定义了一个命名函数,但是匿名函数也是可以接受的。
输入n, m, x, y
均为以下范围内的所有无符号32位整数:
n > 0
m > 0
0 <= x < m
0 <= y < n
输出必须采用(x,y)对的可迭代形式(但是您选择的语言定义了该形式)。
其他说明:
只要可迭代对象的使用者可以访问x
并且y
整数只能知道其位置,复数(以及其他表示形式/序列化)就可以。
基于非零的索引是可接受的,但前提是所选择的语言是非零索引的语言。如果语言使用多种编号系统,则默认使用最常用于表示矩阵的数据结构的编号系统。如果这些仍然是给定语言中的所有外来概念,则任何起始索引都是可以接受的。
(x,y)
自己在矩形中,对吗?