如何排除溢出矩阵的坐标
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))
}
邻居的 x
和 y
索引都可能超出范围,不仅在 -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]
注意,如果x
或y
已经无效,上面的代码仍然会出现panic。如果你想防止它,你还必须验证 x
和 y
,例如:
var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
return result
}
另一种方法是列出另一个切片中邻居的 deltaY
和 deltaX
索引:
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=-1
、x=0
作为输入,将返回 0
的邻居 (y+1,x)。
任务是编写一个函数,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))
}
邻居的 x
和 y
索引都可能超出范围,不仅在 -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]
注意,如果x
或y
已经无效,上面的代码仍然会出现panic。如果你想防止它,你还必须验证 x
和 y
,例如:
var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
return result
}
另一种方法是列出另一个切片中邻居的 deltaY
和 deltaX
索引:
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=-1
、x=0
作为输入,将返回 0
的邻居 (y+1,x)。