Menu
Coddy logo textTech

Zirveler

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

challenge icon

Görev

Bir arazi haritasını temsil eden tam sayı yüksekliklerinden oluşan 2 boyutlu bir ızgara veriliyor. Bir hücre, değeri komşu olan tüm hücrelerden (en fazla 8: kuzey, güney, doğu, batı ve dört diyagonal) kesinlikle daha büyükse zirve (peak) olarak adlandırılır. 

Kurallar

  • 8 Komşu: Kuzey, güney, doğu, batı ve dört diyagonalin tamamını kontrol etmelisiniz.
  • Sınır Hücreleri: Bir hücre kenarda veya köşedeyse, 8'den az komşusu vardır. Eğer mevcut tüm komşularından kesinlikle daha büyükse, hala bir zirvedir.
  • Kesinlikle Büyük: Eğer bir komşu mevcut hücre ile aynı yüksekliğe sahipse, mevcut hücre bir zirve değildir.

Giriş

  • Satır ve sütunları temsil eden iki tam sayı N ve M.
  • Tam sayılardan oluşan N*M boyutunda bir ızgara.

Çıktı

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

Örneğin bu giriş 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 şu konumlarda oluşur:

  • (0,4) yüksekliği 4: Komşularından (3, 1, 1) daha büyük.
  • (1,0) yüksekliği 5: Komşularından (1, 2, 1, 1, 1) daha büyük.
  • (2,2) yüksekliği 9: Etrafındaki 8 adet 1'in tamamından daha büyük.
  • (4,1) yüksekliği 3: Komşularından (2, 1, 1, 1, 1) daha büyük.
  • (4,3) yüksekliği 4: Komşularından (1, 1, 1, 2, 1) daha büyük.

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;
}

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