Menu
Coddy logo textTech

Zirveler

Coddy'nin C Journey'sinin Temeller bölümünün bir parçası. Ders 62 / 63.

challenge icon

Görev

Arazi haritasını temsil eden, tam sayı yükseltilerinden oluşan 2D bir ızgara veriliyor. Bir hücre, değerinin bitişik komşularının tümünden (en fazla 8: kuzey, güney, doğu, batı ve dört çapraz komşu) kesinlikle büyük olması durumunda zirve olarak adlandırılır. 

Kurallar

  • 8 Komşu: Kuzey, güney, doğu, batı ve dört çapraz komşunun tümünü kontrol etmelisin.
  • Sınır Hücreleri: Kenarda veya köşede bulunan bir hücrenin 8’den az komşusu vardır. Hücre, mevcut komşularının tümünden kesinlikle büyükse yine bir zirvedir.
  • Kesinlikle Büyük: Bir komşu mevcut hücreyle aynı yükseltiye sahipse mevcut hücre zirve değildir.

Girdi

  • Satırları ve sütunları temsil eden iki tam sayı: N ve M.
  • Tam sayılardan oluşan bir N*M ızgarası

Çıktı

  1. Toplam zirve sayısını temsil eden bir tam sayı.
  2. Her zirvenin koordinatları (0’dan başlayan satır ve sütun), önce satıra, ardından sütuna göre sıralanmış şekilde.

Örneğin, şu girdi için:

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

Çıktı şöyledir:

5
0 4
1 0
2 2
4 1
4 3

Açıklama Zirveler aşağıdaki konumlarda bulunur:

  • (0,4) yükselti 4: Komşularından (3, 1, 1) daha büyüktür.
  • (1,0) yükselti 5: Komşularından (1, 2, 1, 1, 1) daha büyüktür.
  • (2,2) yükselti 9: Çevresindeki 8 adet 1’in tümünden daha büyüktür.
  • (4,1) yükselti 3: Komşularından (2, 1, 1, 1, 1) daha büyüktür.
  • (4,3) yükselti 4: Komşularından (1, 1, 1, 2, 1) daha büyüktür.

Kendin dene

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * (r, c) konumundaki hücre bir zirve ise 1, aksi takdirde 0 döndürür.
 * Bir zirve, mevcut tüm komşularından kesinlikle daha büyük olmalıdır.
 */
int is_peak(int r, int c) {
    // TODO: 8 komşunun göreceli konumlarını tanımlayın
    // (Kuzey, Güney, Doğu, Batı ve 4 diyagonal).
    
    // TODO: Her bir komşu üzerinden döngü ile geçin.
    // KRİTİK İPUCU: grid[nr][nc] değerini kontrol etmeden önce, 
    // nr ve nc'nin sınırlar içinde (0'dan N-1'e ve 0'dan M-1'e) olduğundan emin OLMALISINIZ.
    
    return 1; // Yer tutucu
}

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

    // TODO: İç içe döngüler kullanarak ızgara değerlerini stdin'den okuyun.
    
    // TODO: Izgaradaki her bir hücre (i, j) üzerinde gezinin.
    // Eğer is_peak(i, j) doğruysa, koordinatları saklayın.
    // Sonuçları yazdırmadan önce saklamak için peak_r[MAXN*MAXM] ve peak_c[MAXN*MAXM] 
    // gibi iki dizi kullanabilirsiniz.

    // TODO: Toplam zirve sayısını yazdırın.
    
    // TODO: Saklanan her bir (satır, sütun) çiftini yazdırın. 
    // Önce satır sonra sütun bazlı gezindiğiniz için bunlar zaten sıralı olacaktır!

    return 0;
}

Temeller bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi