Matrix neighbours
unknown
golang
4 years ago
6.6 kB
10
Indexable
package main
import "fmt"
var input = [][]int{
{9, 3, 0, 0, 8, 3},
{9, 1, 6, 4, 2, 3},
{3, 1, 3, 5, 8, 7},
{9, 8, 3, 7, 4, 9},
{5, 9, 2, 6, 0, 5},
{1, 2, 6, 5, 6, 7},
}
func main() {
// возможно, в самом начале имеет смысл сделать отдельные проверки на тот случай, если в матрице 0 элементов или только 1 элемент
fmt.Println("Here's the input:")
prettyPrint(input)
// создаём пустую матрицу-результат, равную по размерам входной матрице, в шарпе это может делаться как-то иначе
output := make([][]int, len(input))
for i := 0; i < len(output); i++ {
output[i] = make([]int, len(input[0]))
}
// цикл по строкам
for row := 0; row < len(input); row++ {
// цикл по столбцам
for column := 0; column < len(input[row]); column++ {
// находим массив соседей элемента
neighbours := findNeighboursHard(input, row, column)
// если все соседи меньше, чем сам элемент, то в выхлоп проставляем единицу; иначе ноль
if isNeighboursSmallerThanItem(input[row][column], neighbours) {
output[row][column] = 1
} else {
output[row][column] = 0
}
}
}
fmt.Println("\nHere's the output:")
prettyPrint(output)
}
// функция принимает число и массив его соседей; возвращает boolean, отвечающий на вопрос "являются ли все соседи меньше данного числа"
func isNeighboursSmallerThanItem(item int, neighbours []int) bool {
for i := 0; i < len(neighbours); i++ {
// сравниваем каждого соседа с числом; если хотя бы один сосед >=, то остальных можно не проверять, выходим с false
if neighbours[i] >= item {
return false
}
}
// если дошли до конца и не вышли с false, значит все соседи меньше; возвращаем true
return true
}
// функция принимает весь массив + индексы нужного элемента; возвращает массив соседей этого элемента
// аналогична функцииfindNeighboursEasy по результату, но чуть покороче и посложнее для понимания
func findNeighboursHard(arr [][]int, row int, column int) []int {
var result []int
width := len(arr[row]) // объявляем для удобства ширину матрицы
height := len(arr) // высота матрицы, по идее матрицы всегда квадратные, но так оно будет работать с любым двумерным массивом
// ходим по квадрату 3х3 (от -1 до 1) вокруг нашего элемента
for i := -1; i < 2; i++ {
for j := -1; j < 2; j++ {
// скипнем центральный элемент, потому что это не сосед, а сам айтем, для которого мы ищем соседа
if i == 0 && j == 0 {
continue
}
// скипнем несуществующих соседей, которые вылезают за массив горизонтально
if row+i < 0 || row+i >= width {
continue
}
// то же самое, только вертикально
if column+j < 0 || column+j >= height {
continue
}
// если дошли досюда, то всё ок, добавляем соседа в результат
result = append(result, arr[row+i][column+j])
}
}
return result
}
// функция принимает весь массив + индексы нужного элемента; возвращает массив соседей этого элемента
// аналогична findNeighboursHard по результату, но чуть более тупая, потому что все соседи вручную проверяются
func findNeighboursEasy(arr [][]int, row int, column int) []int {
var result []int
width := len(arr[row]) // объявляем для удобства ширину матрицы
height := len(arr) // высота матрицы, по идее матрицы всегда квадратные, но так оно будет работать с любым двумерным массивом
// сначала проверим трёх верхних соседей, если они вообще существуют
if row-1 >= 0 {
// проверка на верхнего левого соседа, если он есть, то добавляем в массив соседей
if column-1 >= 0 {
result = append(result, arr[row-1][column-1])
}
// добавляем верхнего среднего соседа, он по прошлому условию (row-1 >= 0) всегда существует
result = append(result, arr[row-1][column])
// проверка на верхнего правого соседа, если он есть, то добавляем в массив соседей
if column+1 < width {
result = append(result, arr[row-1][column+1])
}
}
// проверим, существует ли левый сосед, и добавим его в результат, если да
if column-1 >= 0 {
result = append(result, arr[row][column-1])
}
// проверим, существует ли правый сосед, и добавим его в результат, если да
if column+1 < width {
result = append(result, arr[row][column+1])
}
// теперь проверим трёх нижних соседей, если они вообще существуют; всё аналогично верхним соседям, только row+1
if row+1 < height {
if column-1 >= 0 {
result = append(result, arr[row+1][column-1])
}
result = append(result, arr[row+1][column])
if column+1 < width {
result = append(result, arr[row+1][column+1])
}
}
return result
}
// это просто функция для красивой печати матрицы в терминале, чтоб не всё в одну строчку
func prettyPrint(arr [][]int) {
for row := range arr {
for column := range arr[row] {
fmt.Print(arr[row][column], " ")
}
fmt.Print("\n")
}
}
Editor is loading...