Menu
Coddy logo textTech

Picchi

Fa parte della sezione Fondamenti del percorso C di Coddy. Lezione 62 di 63.

challenge icon

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 N e M che rappresentano righe e colonne.
  • Una griglia N*M di interi

Output

  1. Un intero che rappresenta il numero totale di picchi.
  2. 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 1

Questo è l'output:

5
0 4
1 0
2 2
4 1
4 3

Spiegazione 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

Esercitati da solo: Compilatore C online