Menu
Coddy logo textTech

Szczyty

Część sekcji Podstawy ścieżki C w Coddy. Lekcja 62 z 63.

challenge icon

Wyzwanie

Otrzymujesz dwuwymiarową siatkę wysokości całkowitych reprezentującą mapę terenu. Komórka jest nazywana szczytem, jeśli jej wartość jest ściśle większa od wartości wszystkich sąsiednich komórek (maksymalnie 8: na północy, południu, wschodzie, zachodzie oraz po przekątnych). 

Zasady

  • 8 sąsiadów: Musisz sprawdzić komórki na północy, południu, wschodzie, zachodzie oraz wszystkie cztery po przekątnych.
  • Komórki brzegowe: Jeśli komórka znajduje się na krawędzi lub w rogu, ma mniej niż 8 sąsiadów. Nadal jest szczytem, jeśli jej wartość jest ściśle większa od wartości wszystkich jej istniejących sąsiadów.
  • Ściśle większa: Jeśli sąsiednia komórka ma taką samą wysokość jak bieżąca komórka, bieżąca komórka nie jest szczytem.

Dane wejściowe

  • Dwie liczby całkowite N i M, oznaczające liczbę wierszy i kolumn.
  • Siatka liczb całkowitych o wymiarach N*M

Dane wyjściowe

  1. Liczba całkowita oznaczająca łączną liczbę szczytów.
  2. Współrzędne (wiersz i kolumna, indeksowane od 0) każdego szczytu, posortowane najpierw według wiersza, a następnie według kolumny.

Na przykład dla następujących danych wejściowych:

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

Dane wyjściowe:

5
0 4
1 0
2 2
4 1
4 3

Wyjaśnienie Szczyty znajdują się w następujących miejscach:

  • (0,4) o wysokości 4: Większa od wysokości sąsiadów (3, 1, 1).
  • (1,0) o wysokości 5: Większa od wysokości sąsiadów (1, 2, 1, 1, 1).
  • (2,2) o wysokości 9: Większa od wysokości wszystkich 8 otaczających ją komórek o wartości 1.
  • (4,1) o wysokości 3: Większa od wysokości sąsiadów (2, 1, 1, 1, 1).
  • (4,3) o wysokości 4: Większa od wysokości sąsiadów (1, 1, 1, 2, 1).

Spróbuj swoich sił

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * Zwraca 1, jeśli komórka na pozycji (r, c) jest szczytem, w przeciwnym razie 0.
 * Szczyt musi mieć wartość ściśle większą od wartości wszystkich istniejących sąsiadów.
 */
int is_peak(int r, int c) {
    // TODO: Określ względne położenie 8 sąsiadów
    // (na północy, południu, wschodzie, zachodzie i na 4 przekątnych).
    
    // TODO: Przejdź przez wszystkich sąsiadów.
    // WAŻNA WSKAZÓWKA: Przed sprawdzeniem grid[nr][nc] MUSISZ się upewnić, 
    // że nr i nc mieszczą się w granicach (od 0 do N-1 oraz od 0 do M-1).
    
    return 1; // Wartość zastępcza
}

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

    // TODO: Wczytaj wartości siatki ze stdin za pomocą zagnieżdżonych pętli.
    
    // TODO: Przejdź przez każdą komórkę (i, j) siatki.
    // Jeśli is_peak(i, j) ma wartość true, zapisz współrzędne.
    // Możesz użyć dwóch tablic, takich jak peak_r[MAXN*MAXM] i peak_c[MAXN*MAXM] 
    // aby przechować wyniki przed ich wypisaniem.

    // TODO: Wypisz łączną liczbę szczytów.
    
    // TODO: Wypisz każdą zapisaną parę (row, col). 
    // Ponieważ przechodzisz najpierw po wierszach, a potem po kolumnach, będą już posortowane!

    return 0;
}

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator C online