Gipfel
Teil des Abschnitts Fundamentals der C-Journey von Coddy — Lektion 62 von 63.
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
NundM, die Zeilen und Spalten darstellen. - Ein
N*MGitter aus Ganzzahlen
Ausgabe
- Eine Ganzzahl, die die Gesamtzahl der Peaks darstellt.
- 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 1Dies ist die Ausgabe:
5
0 4
1 0
2 2
4 1
4 3Erklä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
2Variablen
DatentypenIntegerFloat - DoubleZeichenBooleansKonstantenprintf GrundlagenBenennungsregeln für VariablenType Casting Teil 1Type Casting Teil 2Wiederholungs-Challenge3Operatoren
Arithmetische OperatorenModulo-OperatorInkrement/DekrementZuweisungsoperatorenRelationale OperatorenLogische Operatoren Teil 1Logische Operatoren Teil 2Logische Operatoren Teil 3Wiederholungs-Challenge