Menu
CoddyTech

Puncak

Termasuk bagian Dasar-Dasar dalam perjalanan C di Coddy. Pelajaran 62 dari 63.

challenge icon

Tantangan

Kamu diberi grid 2D berisi bilangan bulat yang menunjukkan ketinggian medan. Sebuah sel disebut puncak jika nilainya lebih besar daripada semua sel tetangganya (hingga 8 sel: utara, selatan, timur, barat, dan keempat diagonal). 

Aturan

  • 8 Tetangga: Kamu harus memeriksa arah utara, selatan, timur, barat, dan keempat diagonal.
  • Sel Batas: Jika sebuah sel berada di tepi atau sudut, jumlah tetangganya kurang dari 8. Sel tersebut tetap merupakan puncak jika nilainya lebih besar daripada semua tetangganya yang ada.
  • Lebih Besar Secara Ketat: Jika tetangga memiliki ketinggian yang sama dengan sel saat ini, sel tersebut bukan puncak.

Input

  • Dua bilangan bulat N dan M yang menunjukkan jumlah baris dan kolom.
  • Grid berukuran N*M yang berisi bilangan bulat

Output

  1. Bilangan bulat yang menunjukkan jumlah total puncak.
  2. Koordinat (baris dan kolom, indeks dimulai dari 0) setiap puncak, diurutkan berdasarkan baris terlebih dahulu, lalu kolom.

Contoh untuk input ini:

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

Berikut outputnya:

5
0 4
1 0
2 2
4 1
4 3

Penjelasan Puncak berada di lokasi berikut:

  • (0,4) dengan ketinggian 4: Lebih tinggi daripada tetangganya (3, 1, 1).
  • (1,0) dengan ketinggian 5: Lebih tinggi daripada tetangganya (1, 2, 1, 1, 1).
  • (2,2) dengan ketinggian 9: Lebih tinggi daripada semua 8 sel bernilai 1 di sekelilingnya.
  • (4,1) dengan ketinggian 3: Lebih tinggi daripada tetangganya (2, 1, 1, 1, 1).
  • (4,3) dengan ketinggian 4: Lebih tinggi daripada tetangganya (1, 1, 1, 2, 1).

Coba sendiri

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * Mengembalikan 1 jika sel di (r, c) adalah puncak, 0 jika tidak.
 * Puncak harus lebih besar daripada semua sel tetangga yang ada.
 */
int is_peak(int r, int c) {
    // TODO: Tentukan posisi relatif dari 8 sel tetangga
    // (Utara, Selatan, Timur, Barat, dan 4 arah diagonal).
    
    // TODO: Periksa setiap sel tetangga dengan perulangan.
    // PETUNJUK PENTING: Sebelum memeriksa grid[nr][nc], kamu HARUS memastikan 
    // bahwa nr dan nc berada dalam batas (0 hingga N-1 dan 0 hingga M-1).
    
    return 1; // Penanda sementara
}

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

    // TODO: Baca nilai grid dari stdin menggunakan perulangan bersarang.
    
    // TODO: Periksa setiap sel (i, j) dalam grid.
    // Jika is_peak(i, j) bernilai true, simpan koordinatnya.
    // Kamu bisa menggunakan dua array seperti peak_r[MAXN*MAXM] dan peak_c[MAXN*MAXM] 
    // untuk menyimpan hasilnya sebelum mencetaknya.

    // TODO: Cetak jumlah total puncak.
    
    // TODO: Cetak setiap pasangan (row, col) yang tersimpan. 
    // Karena kamu menelusuri baris lalu kolom, pasangan tersebut sudah terurut!

    return 0;
}

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler C online