Пики
Часть раздела Fundamentals путешествия по C на Coddy — урок 62 из 63.
Задание
Вам дана двумерная сетка целых чисел, представляющих высоты на карте местности. Ячейка называется пиком, если её значение строго больше значений всех её смежных соседей (до 8 соседей: север, юг, восток, запад и четыре диагонали).
Правила
- 8 соседей: Вы должны проверить север, юг, восток, запад и все четыре диагонали.
- Граничные ячейки: Если ячейка находится на краю или в углу, у неё меньше 8 соседей. Она всё равно считается пиком, если её значение строго больше всех её существующих соседей.
- Строго больше: Если у соседа такая же высота, как и у текущей ячейки, текущая ячейка не является пиком.
Ввод
- Два целых числа
NиM, представляющие количество строк и столбцов. - Сетка целых чисел размером
N*M
Вывод
- Целое число, представляющее общее количество пиков.
- Координаты (строка и столбец, индексация с 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
2Переменные
Типы данныхЦелые числаFloat и DoubleСимволыЛогический типКонстантыОсновы printfПравила именования переменныхПриведение типов. Часть 1Приведение типов. Часть 2Итоговое задание3Операторы
Арифметические операторыОператор остатка от деленияИнкремент и декрементОператоры присваиванияОператоры сравненияЛогические операторы. Часть 1Логические операторы. Часть 2Логические операторы. Часть 3Задание на повторение