如何在不包含负值的情况下获得矩阵中的所有邻居索引?

时间:2018-10-01 08:00:43

标签: algorithm matrix rust

我正在努力寻找(usize, usize) x N矩阵中给定位置(即M)的所有直接邻居。

矩阵提供方法get(p: Position) -> Option<T>,在该方法中进行边界检查,如果位置超出范围,则返回None。这意味着不需要检查上限,但是仍然需要检查下限。也就是说,它不会在任何方向下溢出0

我的第一个尝试是遍历切片&[-1, 0, 1]并使用checked_add,但这是行不通的,因为-1不是usize

我的下一个尝试是从我的位置(xy中减去1,然后在切片&[0, 1, 2]上进行迭代,但这对位置{{1}无效) }或(0, _)

我准备了playground,其中一个人可以实现一个功能。 (我希望我的测试是正确的)

(_, 0)

({type Position = (usize, usize) //x, y fn get_neighbours(p: Position) -> impl Iterator<Item = Position> { unimplemented!() } 可以替换为impl Iterator)。

1 个答案:

答案 0 :(得分:2)

You just need to use if expressions to handle the special case that the coordinates are zero, e.g.

fn get_neighbours(p: Position) -> impl Iterator<Item = Position> {
    let m_range = if p.0 > 0 { p.0 - 1..p.0 + 2 } else { 0..2 };
    let n_range = if p.1 > 0 { p.1 - 1..p.1 + 2 } else { 0..2 };
    m_range
        .flat_map(move |m| n_range.clone().map(move |n| (m, n)))
        .filter(move |&q| p != q)
}