Menu
Coddy logo textTech

Picos

Parte da seção Fundamentals do Journey de C da Coddy — lição 62 de 63.

challenge icon

Desafio

Você recebe uma grade 2D de elevações inteiras representando um mapa de terreno. Uma célula é chamada de pico se seu valor for estritamente maior do que todos os seus vizinhos adjacentes (até 8: norte, sul, leste, oeste e as quatro diagonais). 

Regras

  • 8 Vizinhos: Você deve verificar o norte, sul, leste, oeste e todas as quatro diagonais.
  • Células de Fronteira: Se uma célula estiver na borda ou no canto, ela terá menos de 8 vizinhos. Ela ainda será um pico se for estritamente maior do que todos os seus vizinhos existentes.
  • Estritamente Maior: Se um vizinho tiver a mesma elevação que a célula atual, a célula atual não é um pico.

Entrada

  • Dois inteiros N e M representando linhas e colunas.
  • Uma grade N*M de inteiros

Saída

  1. Um inteiro representando o número total de picos.
  2. As coordenadas (linha e coluna, indexadas em 0) de cada pico, ordenadas primeiro por linha e depois por coluna.

Por exemplo, para esta entrada:

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

Esta é a saída:

5
0 4
1 0
2 2
4 1
4 3

Explicação Os picos ocorrem nos seguintes locais:

  • (0,4) com elevação 4: Maior que os vizinhos (3, 1, 1).
  • (1,0) com elevação 5: Maior que os vizinhos (1, 2, 1, 1, 1).
  • (2,2) com elevação 9: Maior que todos os 8 vizinhos com valor 1.
  • (4,1) com elevação 3: Maior que os vizinhos (2, 1, 1, 1, 1).
  • (4,3) com elevação 4: Maior que os vizinhos (1, 1, 1, 2, 1).

Experimente você mesmo

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * Retorna 1 se a célula em (r, c) for um pico, 0 caso contrário.
 * Um pico deve ser estritamente maior que todos os vizinhos existentes.
 */
int is_peak(int r, int c) {
    // TODO: Definir as posições relativas dos 8 vizinhos
    // (Norte, Sul, Leste, Oeste e as 4 diagonais).
    
    // TODO: Percorrer cada vizinho.
    // DICA CRÍTICA: Antes de verificar grid[nr][nc], você DEVE garantir 
    // que nr e nc estejam dentro dos limites (0 a N-1 e 0 a M-1).
    
    return 1; // Espaço reservado (Placeholder)
}

int main() {
    // Ler dimensões
    if (scanf("%d %d", &N, &M) != 2) {
        return 1;
    }

    // TODO: Ler os valores da grade do stdin usando loops aninhados.
    
    // TODO: Iterar sobre cada célula (i, j) na grade.
    // Se is_peak(i, j) for verdadeiro, armazene as coordenadas.
    // Você pode usar dois arrays como peak_r[MAXN*MAXM] e peak_c[MAXN*MAXM] 
    // para armazenar os resultados antes de imprimir.

    // TODO: Imprimir a contagem total de picos.
    
    // TODO: Imprimir cada par (linha, coluna) armazenado. 
    // Como você itera por linha e depois por coluna, eles já estarão ordenados!

    return 0;
}

Todas as lições de Fundamentals