Picos
Parte da seção Fundamentals do Journey de C da Coddy — lição 62 de 63.
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
NeMrepresentando linhas e colunas. - Uma grade
N*Mde inteiros
Saída
- Um inteiro representando o número total de picos.
- 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 1Esta é a saída:
5
0 4
1 0
2 2
4 1
4 3Explicaçã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
2Variáveis
Tipos de DadosInteiroFloat - DoubleCaracteresBooleanosConstantesFundamentos do printfRegras de Nomenclatura de VariáveisConversão de Tipos Parte 1Conversão de Tipos Parte 2Desafio de Recapitulação3Operadores
Operadores AritméticosOperador de MóduloIncremento/DecrementoOperadores de AtribuiçãoOperadores RelacionaisOperadores Lógicos Parte 1Operadores Lógicos Parte 2Operadores Lógicos Parte 3Desafio de Recapitulação