代码之家  ›  专栏  ›  技术社区  ›  hellow Adolfo Casari

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

  •  0
  • hellow Adolfo Casari  · 技术社区  · 7 年前

    我正在努力寻找一个特定职位的所有直接邻居(这是一个 (usize, usize) N M

    矩阵提供了一种方法 get(p: Position) -> Option<T> 进行边界检查并返回 None 0

    我的第一次尝试是迭代切片 &[-1, 0, 1] 使用 checked_add ,但这不起作用,因为 -1 usize .

    x y )然后在切片上迭代 &[0, 1, 2] (0, _) (_, 0) .

    playground ,其中一个只能实现一个功能(我希望我的测试是正确的)

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

    ( impl Iterator 可以替换为 Vec 如有必要)。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Shepmaster Tim Diekmann    7 年前

    你只需要使用 if 用于处理坐标为零的特殊情况的表达式,例如。

    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)
    }