Menu
CoddyTech

Đỉnh

Thuộc phần Nền tảng cơ bản trong hành trình C của Coddy. Bài học 62 trên 63.

challenge icon

Thử thách

Bạn được cho một lưới 2D gồm các độ cao số nguyên, biểu diễn bản đồ địa hình. Một ô được gọi là đỉnh nếu giá trị của ô đó lớn hơn hẳn giá trị của tất cả các ô lân cận (tối đa 8 ô: phía bắc, phía nam, phía đông, phía tây và bốn đường chéo). 

Quy tắc

  • 8 ô lân cận: Bạn phải kiểm tra các ô phía bắc, phía nam, phía đông, phía tây và cả bốn ô trên đường chéo.
  • Ô ở biên: Ô nằm ở cạnh hoặc góc có ít hơn 8 ô lân cận. Ô đó vẫn là đỉnh nếu giá trị của nó lớn hơn hẳn giá trị của tất cả các ô lân cận đang tồn tại.
  • Lớn hơn hẳn: Nếu ô lân cận có độ cao bằng ô hiện tại, ô hiện tại không phải là đỉnh.

Đầu vào

  • Hai số nguyên N và M biểu thị số hàng và số cột.
  • Một lưới số nguyên có kích thước N*M

Đầu ra

  1. Một số nguyên biểu thị tổng số đỉnh.
  2. Tọa độ (hàng và cột, đánh chỉ số từ 0) của từng đỉnh, được sắp xếp theo hàng trước rồi đến cột.

Ví dụ với đầu vào sau:

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

Đầu ra là:

5
0 4
1 0
2 2
4 1
4 3

Giải thích Các đỉnh nằm ở những vị trí sau:

  • (0,4) có độ cao 4: Lớn hơn các ô lân cận (3, 1, 1).
  • (1,0) có độ cao 5: Lớn hơn các ô lân cận (1, 2, 1, 1, 1).
  • (2,2) có độ cao 9: Lớn hơn cả 8 ô xung quanh có giá trị 1.
  • (4,1) có độ cao 3: Lớn hơn các ô lân cận (2, 1, 1, 1, 1).
  • (4,3) có độ cao 4: Lớn hơn các ô lân cận (1, 1, 1, 2, 1).

Tự làm thử

#include <stdio.h>

#define MAXN 100
#define MAXM 100

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

/**
 * Trả về 1 nếu ô tại (r, c) là đỉnh, ngược lại trả về 0.
 * Ô đỉnh phải có giá trị lớn hơn tất cả ô lân cận hiện có.
 */
int is_peak(int r, int c) {
    // TODO: Xác định vị trí tương đối của 8 ô lân cận
    // (phía bắc, nam, đông, tây và 4 hướng chéo).
    
    // TODO: Duyệt qua từng ô lân cận.
    // GỢI Ý QUAN TRỌNG: Trước khi kiểm tra grid[nr][nc], bạn PHẢI bảo đảm 
    // nr và nc nằm trong giới hạn (từ 0 đến N-1 và từ 0 đến M-1).
    
    return 1; // Phần giữ chỗ
}

int main() {
    // Đọc kích thước
    if (scanf("%d %d", &N, &M) != 2) {
        return 1;
    }

    // TODO: Đọc các giá trị của lưới từ stdin bằng các vòng lặp lồng nhau.
    
    // TODO: Duyệt qua mọi ô (i, j) trong lưới.
    // Nếu is_peak(i, j) trả về true, hãy lưu tọa độ.
    // Bạn có thể dùng hai mảng (array) như peak_r[MAXN*MAXM] và peak_c[MAXN*MAXM] 
    // để lưu kết quả trước khi in ra.

    // TODO: In ra tổng số đỉnh.
    
    // TODO: In ra từng cặp (row, col) đã lưu. 
    // Vì bạn duyệt theo hàng rồi đến cột, các cặp đã được sắp xếp đúng thứ tự!

    return 0;
}

Tất cả bài học trong Nền tảng cơ bản

Tự luyện tập: Trình biên dịch C online