如何排除溢出矩阵的坐标

How to exclude coordinates which overflow matrix

任务是编写一个函数,returns 一个元素的所有邻居。对角线元素不被视为邻居。

总的来说,问题是解决了,但是如果元素落在矩阵之外,编译器会产生运行时错误:index out of range [-1]。现在我正在考虑制定一个排除矩阵外数据的条件。你能告诉我这样的情况会是什么样子吗?我已经尝试过类似的方法:if element = -1, then remove element from response.但是没用。

package main

import "fmt"

func Input(y, x int) []int {
    matrix := [][]int{
        []int{0, 2, 3},
        []int{2, 3, 1},
        []int{8, 7, 4},
        []int{3, 2, 1},
    }
    k := []int{matrix[y+1][x], matrix[y-1][x], matrix[y][x+1], matrix[y][x-1]}
    for _, z := range k {
        if z == -1 { //error
            return append(k[z:], k[:z-1]...)
        }
    }
    return k
}
func main() {
    fmt.Println(Input(0, 0))
}

邻居的 xy 索引都可能超出范围,不仅在 -1 时,而且当它们 >= 您索引的切片的长度时和他们在一起。

所以基本上有 4 个邻居:

(y-1,x), (y+1, x), (y,x-1), (y,x+1)

你必须检查所有越界的情况。您的恐慌发生在 k := ... 行,而不是 for 循环内。同样在循环的早期返回将不会处理所有元素,并且 for 从根本上就是错误的。

基本上你可以这样做:

var result []int

if y > 0 {
    result = append(result, matrix[y-1][x])
}
if y < len(matrix)-1 {
    result = append(result, matrix[y+1][x])
}
if x > 0 {
    result = append(result, matrix[y][x-1])
}
if x < len(matrix[y])-1 {
    result = append(result, matrix[y][x+1])
}

return result

这将输出(在 Go Playground 上尝试):

[2 2]

注意,如果xy已经无效,上面的代码仍然会出现panic。如果你想防止它,你还必须验证 xy,例如:

var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
    return result
}

另一种方法是列出另一个切片中邻居的 deltaYdeltaX 索引:

var neighbors = [][]int{
    {-1, 0},
    {1, 0},
    {0, -1},
    {0, 1},
}

您可以使用循环遍历 neighbors,然后您可以在一个地方检查索引:

var result []int
for _, neighbor := range neighbors {
    iy, ix := y+neighbor[0], x+neighbor[1]
    if iy < 0 || iy >= len(matrix) || ix < 0 || ix >= len(matrix[iy]) {
        continue
    }
    result = append(result, matrix[iy][ix])
}

return result

Go Playground 上试试这个。

请注意,如果您在矩阵外部指定索引,并且该元素的邻居落在矩阵内,则此第二个解决方案也 returns 邻居。例如。使用 y=-1x=0 作为输入,将返回 0 的邻居 (y+1,x)。