如何排除溢出矩阵的坐标

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


一般来说,问题是解决了,但是如果元素落在矩阵之外,编译器会产生运行时错误: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))

}


拉莫斯之舞
浏览 52回答 1
1回答

交互式爱情

x邻居的 和索引都y可能超出范围,不仅是在 时-1,而且当它们 >= 您用它们索引的切片的长度时。所以基本上有 4 个邻居:(y-1,x), (y+1, x), (y,x-1), (y,x+1)你必须检查所有越界的情况。您的恐慌发生在线路上k := ...,而不是在for循环内。同样在循环的早期返回将不会处理所有元素,这for从根本上就是错误的。所以基本上这是你可以做到的:var result []intif y > 0 {&nbsp; &nbsp; result = append(result, matrix[y-1][x])}if y < len(matrix)-1 {&nbsp; &nbsp; result = append(result, matrix[y+1][x])}if x > 0 {&nbsp; &nbsp; result = append(result, matrix[y][x-1])}if x < len(matrix[y])-1 {&nbsp; &nbsp; result = append(result, matrix[y][x+1])}return result这将输出(在Go Playground上尝试):[2 2]注意,如果xory已经无效,上面的代码仍然会 panic。如果你想防止它,你还必须验证xand y,例如:var result []intif y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {&nbsp; &nbsp; return result}另一种方法是在另一个切片中列出邻居的deltaY和索引:deltaXvar neighbors = [][]int{&nbsp; &nbsp; {-1, 0},&nbsp; &nbsp; {1, 0},&nbsp; &nbsp; {0, -1},&nbsp; &nbsp; {0, 1},}您可以使用循环遍历neighbors,然后您可以在一个地方检查索引:var result []intfor _, neighbor := range neighbors {&nbsp; &nbsp; iy, ix := y+neighbor[0], x+neighbor[1]&nbsp; &nbsp; if iy < 0 || iy >= len(matrix) || ix < 0 || ix >= len(matrix[iy]) {&nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; }&nbsp; &nbsp; result = append(result, matrix[iy][ix])}return result在Go Playground试试这个。请注意,如果您在矩阵外部指定索引,并且该元素的邻居落在矩阵内,则第二个解决方案也会返回邻居。y=-1例如,使用, 作为输入,将返回x=0邻居 (y+1,x) 。0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go