Picos
Parte de la sección Fundamentals del Journey de C de Coddy — lección 62 de 63.
Desafío
Se te proporciona una cuadrícula 2D de elevaciones enteras que representa un mapa de terreno. Una celda se denomina pico si su valor es estrictamente mayor que todos sus vecinos adyacentes (hasta 8: norte, sur, este, oeste y las cuatro diagonales).
Reglas
- 8 Vecinos: Debes verificar el norte, sur, este, oeste y las cuatro diagonales.
- Celdas de Borde: Si una celda está en un borde o esquina, tiene menos de 8 vecinos. Sigue siendo un pico si es estrictamente mayor que todos sus vecinos existentes.
- Estrictamente Mayor: Si un vecino tiene la misma elevación que la celda actual, la celda actual no es un pico.
Entrada
- Dos enteros
NyMque representan las filas y columnas. - Una cuadrícula de
N*Menteros
Salida
- Un entero que representa el número total de picos.
- Las coordenadas (fila y columna, indexadas desde 0) de cada pico, ordenadas primero por fila y luego por columna.
Por ejemplo, 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 es la salida:
5
0 4
1 0
2 2
4 1
4 3Explicación Los picos ocurren en las siguientes ubicaciones:
- (0,4) con elevación 4: Mayor que los vecinos (3, 1, 1).
- (1,0) con elevación 5: Mayor que los vecinos (1, 2, 1, 1, 1).
- (2,2) con elevación 9: Mayor que los 8 unos circundantes.
- (4,1) con elevación 3: Mayor que los vecinos (2, 1, 1, 1, 1).
- (4,3) con elevación 4: Mayor que los vecinos (1, 1, 1, 2, 1).
Pruébalo tú mismo
#include <stdio.h>
#define MAXN 100
#define MAXM 100
int N, M;
int grid[MAXN][MAXM];
/**
* Devuelve 1 si la celda en (r, c) es un pico, 0 en caso contrario.
* Un pico debe ser estrictamente mayor que todos los vecinos existentes.
*/
int is_peak(int r, int c) {
// TODO: Definir las posiciones relativas de los 8 vecinos
// (Norte, Sur, Este, Oeste y las 4 diagonales).
// TODO: Recorrer cada vecino.
// PISTA CRÍTICA: Antes de verificar grid[nr][nc], DEBES asegurarte
// de que nr y nc estén dentro de los límites (0 a N-1 y 0 a M-1).
return 1; // Marcador de posición
}
int main() {
// Leer dimensiones
if (scanf("%d %d", &N, &M) != 2) {
return 1;
}
// TODO: Leer los valores de la cuadrícula desde stdin usando bucles anidados.
// TODO: Iterar sobre cada celda (i, j) en la cuadrícula.
// Si is_peak(i, j) es verdadero, almacenar las coordenadas.
// Puedes usar dos arreglos como peak_r[MAXN*MAXM] y peak_c[MAXN*MAXM]
// para almacenar los resultados antes de imprimir.
// TODO: Imprimir el recuento total de picos.
// TODO: Imprimir cada par (fila, col) almacenado.
// Dado que iteras por fila y luego por columna, ¡ya estarán ordenados!
return 0;
}Todas las lecciones de Fundamentals
2Variables
Tipos de datosEnterosFloat - DoubleCaracteresBooleanosConstantesConceptos básicos de printfReglas para nombrar variablesConversión de tipos Parte 1Conversión de tipos Parte 2Desafío de repaso3Operadores
Operadores aritméticosOperador de móduloIncremento/DecrementoOperadores de asignaciónOperadores relacionalesOperadores lógicos - Parte 1Operadores lógicos - Parte 2Operadores lógicos - Parte 3Desafío de repaso