Picchi
Fa parte della sezione Fondamenti del percorso C di Coddy. Lezione 62 di 63.
Sfida
Ti viene data una griglia 2D di elevazioni intere che rappresenta una mappa del terreno. Una cella è detta picco se il suo valore è strettamente maggiore di tutti i suoi vicini adiacenti (fino a 8: nord, sud, est, ovest e le quattro diagonali).
Regole
- 8 vicini: Devi controllare nord, sud, est, ovest e tutte e quattro le diagonali.
- Celle di confine: Se una cella si trova sul bordo o in un angolo, ha meno di 8 vicini. È comunque un picco se è strettamente maggiore di tutti i suoi vicini esistenti.
- Strettamente maggiore: Se un vicino ha la stessa elevazione della cella corrente, la cella corrente non è un picco.
Input
- Due interi
NeMche rappresentano righe e colonne. - Una griglia
N*Mdi interi
Output
- Un intero che rappresenta il numero totale di picchi.
- Le coordinate (riga e colonna, indicizzate a partire da 0) di ciascun picco, ordinate prima per riga e poi per colonna.
Ad esempio, per questo input:
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 1Questo è l'output:
5
0 4
1 0
2 2
4 1
4 3Spiegazione I picchi si trovano nelle seguenti posizioni:
- (0,4) con elevazione 4: maggiore dei vicini (3, 1, 1).
- (1,0) con elevazione 5: maggiore dei vicini (1, 2, 1, 1, 1).
- (2,2) con elevazione 9: maggiore di tutti gli 8 valori 1 circostanti.
- (4,1) con elevazione 3: maggiore dei vicini (2, 1, 1, 1, 1).
- (4,3) con elevazione 4: maggiore dei vicini (1, 1, 1, 2, 1).
Provalo tu
#include <stdio.h>
#define MAXN 100
#define MAXM 100
int N, M;
int grid[MAXN][MAXM];
/**
* Restituisce 1 se la cella in (r, c) è un picco, altrimenti 0.
* Un picco deve essere strettamente maggiore di tutti i vicini esistenti.
*/
int is_peak(int r, int c) {
// TODO: Definisci le posizioni relative degli 8 vicini
// (Nord, Sud, Est, Ovest e le 4 diagonali).
// TODO: Scorri tutti i vicini.
// SUGGERIMENTO CRITICO: Prima di controllare grid[nr][nc], DEVI assicurarti
// che nr e nc siano entro i limiti (da 0 a N-1 e da 0 a M-1).
return 1; // Segnaposto
}
int main() {
// Leggi le dimensioni
if (scanf("%d %d", &N, &M) != 2) {
return 1;
}
// TODO: Leggi i valori della griglia da stdin usando cicli annidati.
// TODO: Scorri ogni cella (i, j) della griglia.
// Se is_peak(i, j) è true, memorizza le coordinate.
// Puoi usare due array come peak_r[MAXN*MAXM] e peak_c[MAXN*MAXM]
// per memorizzare i risultati prima di stamparli.
// TODO: Stampa il numero totale di picchi.
// TODO: Stampa ogni coppia (row, col) memorizzata.
// Poiché scorri prima le righe e poi le colonne, saranno già ordinate!
return 0;
}Tutte le lezioni di Fondamenti
2Variabili
Tipi di datiInteroFloat - DoubleCaratteriValori booleaniCostantiFondamenti di printfRegole di denominazione delle variabiliConversione di tipo parte 1Conversione di tipo parte 2Sfida di ripasso3Operatori
Operatori aritmeticiOperatore moduloIncremento/DecrementoOperatori di assegnazioneOperatori relazionaliOperatori logici Parte 1Operatori logici Parte 2Operatori logici Parte 3Sfida di riepilogoEsercitati da solo: Compilatore C online