Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

القمم

جزء من قسم Fundamentals في رحلة C على Coddy — الدرس 62 من 63.

challenge icon

التحدي

تُعطى شبكة ثنائية الأبعاد من الارتفاعات الصحيحة التي تمثل خريطة تضاريس. تُسمى الخلية peak (قمة) إذا كانت قيمتها أكبر تماماً من جميع جيرانها المتلاصقين (يصل عددهم إلى 8: الشمال، الجنوب، الشرق، الغرب، والأقطار الأربعة). 

القواعد

  • 8 جيران: يجب عليك التحقق من الشمال، الجنوب، الشرق، الغرب، وجميع الأقطار الأربعة.
  • خلايا الحدود: إذا كانت الخلية على الحافة أو الزاوية، فسيكون لديها أقل من 8 جيران. تظل تعتبر قمة إذا كانت أكبر تماماً من جميع جيرانها الموجودين.
  • أكبر تماماً: إذا كان لأحد الجيران نفس ارتفاع الخلية الحالية، فإن الخلية الحالية ليست قمة.

الإدخال

  • عددان صحيحان N و M يمثلان الصفوف والأعمدة.
  • شبكة N*M من الأعداد الصحيحة

المخرجات

  1. عدد صحيح يمثل إجمالي عدد القمم.
  2. إحداثيات (الصف والعمود، تبدأ من 0) لكل قمة، مرتبة أولاً حسب الصف ثم حسب العمود.

على سبيل المثال لهذا الإدخال:

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

هذه هي المخرجات:

5
0 4
1 0
2 2
4 1
4 3

التفسير تقع القمم في المواقع التالية:

  • (0,4) بارتفاع 4: أكبر من الجيران (3, 1, 1).
  • (1,0) بارتفاع 5: أكبر من الجيران (1, 2, 1, 1, 1).
  • (2,2) بارتفاع 9: أكبر من جميع الـ 1 الثمانية المحيطة بها.
  • (4,1) بارتفاع 3: أكبر من الجيران (2, 1, 1, 1, 1).
  • (4,3) بارتفاع 4: أكبر من الجيران (1, 1, 1, 2, 1).

جرّب بنفسك

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * تعيد 1 إذا كانت الخلية عند (r, c) قمة، و 0 غير ذلك.
 * يجب أن تكون القمة أكبر تماماً من جميع الجيران الموجودين.
 */
int is_peak(int r, int c) {
    // TODO: قم بتعريف المواقع النسبية للجيران الثمانية
    // (الشمال، الجنوب، الشرق، الغرب، والأقطار الأربعة).
    
    // TODO: قم بالمرور عبر كل جار في حلقة تكرارية.
    // تلميح هام: قبل التحقق من grid[nr][nc]، يجب عليك التأكد
    // من أن nr و nc ضمن الحدود (من 0 إلى N-1 ومن 0 إلى M-1).
    
    return 1; // مكان محجوز للنتيجة
}

int main() {
    // قراءة الأبعاد
    if (scanf("%d %d", &N, &M) != 2) {
        return 1;
    }

    // TODO: اقرأ قيم الشبكة من stdin باستخدام حلقات متداخلة.
    
    // TODO: قم بالمرور على كل خلية (i, j) في الشبكة.
    // إذا كانت is_peak(i, j) صحيحة، قم بتخزين الإحداثيات.
    // يمكنك استخدام مصفوفتين مثل peak_r[MAXN*MAXM] و peak_c[MAXN*MAXM] 
    // لتخزين النتائج قبل طباعتها.

    // TODO: اطبع العدد الإجمالي للقمم.
    
    // TODO: اطبع كل زوج (row, col) مخزن.
    // بما أنك تمر عبر الصفوف ثم الأعمدة، فستكون النتائج مرتبة بالفعل!

    return 0;
}

جميع دروس Fundamentals