Как получить все индексы соседей в матрице без учета отрицательных значений? - PullRequest
0 голосов
/ 01 октября 2018

Я изо всех сил пытаюсь найти всех прямых соседей для данной позиции (которая является (usize, usize)) в матрице N x M.

Матрица предоставляет метод get(p: Position) -> Option<T> гдеон выполняет проверку границ и возвращает None, если позиция находится вне диапазона.Это означает, что верхнюю границу не нужно проверять, но нижнюю границу все еще нужно.То есть он не теряет значение 0 в любом направлении.

Моей первой попыткой было выполнить итерацию по срезу &[-1, 0, 1] и использовать checked_add, но это не работает, поскольку -1 не являетсяusize.

Моя следующая попытка состояла в том, чтобы вычесть 1 из моей позиции (как x и y), а затем выполнить итерацию по срезу &[0, 1, 2], но это не работает с позицией (0, _)или (_, 0).

Я подготовил игровую площадку , где можно просто реализовать одну функцию.(Надеюсь, мои тесты верны)

type Position = (usize, usize) //x, y

fn get_neighbours(p: Position) -> impl Iterator<Item = Position> {
    unimplemented!()
}

(impl Iterator при необходимости можно заменить на Vec).

1 Ответ

0 голосов
/ 01 октября 2018

Вам просто нужно использовать 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...