Menu
Coddy logo textTech

Gipfel

Teil des Abschnitts Fundamentals der C-Journey von Coddy — Lektion 62 von 63.

challenge icon

Aufgabe

Sie erhalten ein 2D-Gitter aus ganzzahligen Höhenwerten, das eine Geländekarte darstellt. Eine Zelle wird als Peak (Gipfel) bezeichnet, wenn ihr Wert strikt größer ist als der Wert aller ihrer angrenzenden Nachbarn (bis zu 8: Norden, Süden, Osten, Westen und die vier Diagonalen). 

Regeln

  • 8 Nachbarn: Sie müssen Norden, Süden, Osten, Westen und alle vier Diagonalen überprüfen.
  • Randzellen: Wenn sich eine Zelle am Rand oder in einer Ecke befindet, hat sie weniger als 8 Nachbarn. Sie ist dennoch ein Peak, wenn sie strikt größer ist als alle ihre vorhandenen Nachbarn.
  • Strikt größer: Wenn ein Nachbar die gleiche Höhe wie die aktuelle Zelle hat, ist die aktuelle Zelle kein Peak.

Eingabe

  • Zwei Ganzzahlen N und M, die Zeilen und Spalten darstellen.
  • Ein N*M Gitter aus Ganzzahlen

Ausgabe

  1. Eine Ganzzahl, die die Gesamtzahl der Peaks darstellt.
  2. Die Koordinaten (Zeile und Spalte, 0-indiziert) jedes Peaks, zuerst nach Zeile und dann nach Spalte sortiert.

Beispiel für diese Eingabe:

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

Dies ist die Ausgabe:

5
0 4
1 0
2 2
4 1
4 3

Erklärung Die Peaks treten an den folgenden Stellen auf:

  • (0,4) mit Höhe 4: Größer als die Nachbarn (3, 1, 1).
  • (1,0) mit Höhe 5: Größer als die Nachbarn (1, 2, 1, 1, 1).
  • (2,2) mit Höhe 9: Größer als alle 8 umgebenden 1en.
  • (4,1) mit Höhe 3: Größer als die Nachbarn (2, 1, 1, 1, 1).
  • (4,3) mit Höhe 4: Größer als die Nachbarn (1, 1, 1, 2, 1).

Probier es selbst

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * Gibt 1 zurück, wenn die Zelle bei (r, c) ein Gipfel ist, andernfalls 0.
 * Ein Gipfel muss strikt größer als alle existierenden Nachbarn sein.
 */
int is_peak(int r, int c) {
    // TODO: Definiere die relativen Positionen der 8 Nachbarn
    // (Norden, Süden, Osten, Westen und die 4 Diagonalen).
    
    // TODO: Durchlaufe jeden Nachbarn in einer Schleife.
    // KRITISCHER HINWEIS: Bevor grid[nr][nc] geprüft wird, MUSS sichergestellt werden, 
    // dass nr und nc innerhalb der Grenzen liegen (0 bis N-1 und 0 bis M-1).
    
    return 1; // Platzhalter
}

int main() {
    // Dimensionen einlesen
    if (scanf("%d %d", &N, &M) != 2) {
        return 1;
    }

    // TODO: Lies die Gitterwerte über verschachtelte Schleifen von stdin ein.
    
    // TODO: Iteriere über jede Zelle (i, j) im Gitter.
    // Wenn is_peak(i, j) wahr ist, speichere die Koordinaten.
    // Du kannst zwei Arrays wie peak_r[MAXN*MAXM] und peak_c[MAXN*MAXM] verwenden, 
    // um die Ergebnisse vor der Ausgabe zu speichern.

    // TODO: Gib die Gesamtzahl der Gipfel aus.
    
    // TODO: Gib jedes gespeicherte (Zeile, Spalte) Paar aus. 
    // Da du erst nach Zeile und dann nach Spalte iterierst, sind sie bereits sortiert!

    return 0;
}

Alle Lektionen in Fundamentals