Menu
Coddy logo textTech

Пики

Часть раздела Fundamentals путешествия по C на Coddy — урок 62 из 63.

challenge icon

Задание

Вам дана двумерная сетка целых чисел, представляющих высоты на карте местности. Ячейка называется пиком, если её значение строго больше значений всех её смежных соседей (до 8 соседей: север, юг, восток, запад и четыре диагонали). 

Правила

  • 8 соседей: Вы должны проверить север, юг, восток, запад и все четыре диагонали.
  • Граничные ячейки: Если ячейка находится на краю или в углу, у неё меньше 8 соседей. Она всё равно считается пиком, если её значение строго больше всех её существующих соседей.
  • Строго больше: Если у соседа такая же высота, как и у текущей ячейки, текущая ячейка не является пиком.

Ввод

  • Два целых числа N и M, представляющие количество строк и столбцов.
  • Сетка целых чисел размером N*M

Вывод

  1. Целое число, представляющее общее количество пиков.
  2. Координаты (строка и столбец, индексация с 0) каждого пика, отсортированные сначала по строке, затем по столбцу.

Например, для такого ввода:

5 5
1 2 1 3 4
5 1 1 1 1
1 1 9 1 1
2 1 1 1 2
1 3 1 4 1

Вот такой вывод:

5
0 4
1 0
2 2
4 1
4 3

Пояснение Пики находятся в следующих местах:

  • (0,4) с высотой 4: Больше соседей (3, 1, 1).
  • (1,0) с высотой 5: Больше соседей (1, 2, 1, 1, 1).
  • (2,2) с высотой 9: Больше всех 8 окружающих единиц.
  • (4,1) с высотой 3: Больше соседей (2, 1, 1, 1, 1).
  • (4,3) с высотой 4: Больше соседей (1, 1, 1, 2, 1).

Попробуйте сами

#include <stdio.h>

#define MAXN 100
#define MAXM 100

int N, M;
int grid[MAXN][MAXM];

/**
 * Возвращает 1, если ячейка (r, c) является пиком, иначе 0.
 * Пик должен быть строго больше всех существующих соседей.
 */
int is_peak(int r, int c) {
    // TODO: Определите относительные координаты 8 соседей
    // (север, юг, восток, запад и 4 диагонали).
    
    // TODO: Переберите каждого соседа в цикле.
    // ВАЖНОЕ ЗАМЕЧАНИЕ: Перед проверкой grid[nr][nc] вы ДОЛЖНЫ убедиться, 
    // что nr и nc находятся в пределах границ (от 0 до N-1 и от 0 до M-1).
    
    return 1; // Заглушка
}

int main() {
    // Чтение размеров
    if (scanf("%d %d", &N, &M) != 2) {
        return 1;
    }

    // TODO: Считайте значения сетки из stdin, используя вложенные циклы.
    
    // TODO: Переберите каждую ячейку (i, j) в сетке.
    // Если is_peak(i, j) истинно, сохраните координаты.
    // Вы можете использовать два массива, например peak_r[MAXN*MAXM] и peak_c[MAXN*MAXM], 
    // чтобы сохранить результаты перед выводом.

    // TODO: Выведите общее количество пиков.
    
    // TODO: Выведите каждую сохраненную пару (строка, столбец). 
    // Поскольку вы перебираете сначала строки, а затем столбцы, они уже будут отсортированы!

    return 0;
}

Все уроки раздела Fundamentals