Menu
Coddy logo textTech

ピーク

CoddyのCジャーニー「Fundamentals」セクションの一部 — レッスン 62/63。

challenge icon

チャレンジ

地形図を表す整数の標高の2Dグリッドが与えられます。あるセルの値が、そのすべての隣接する隣人(最大8つ:北、南、東、西、および4つの対角線)よりも厳密に大きい場合、そのセルをピークと呼びます。 

ルール

  • 8つの隣人: 北、南、東、西、および4つの対角線すべてをチェックする必要があります。
  • 境界セル: セルが端や角にある場合、隣人は8つ未満になります。その場合でも、存在するすべての隣人よりも厳密に大きければ、それはピークです。
  • 厳密に大きい: 隣人が現在のセルと同じ標高である場合、現在のセルはピークではありません

入力

  • 行と列を表す2つの整数 NM
  • 整数の 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:周囲の8つの 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];

/**
 * セル (r, c) がピークであれば 1 を、そうでなければ 0 を返します。
 * ピークは、存在するすべての隣接するセルよりも厳密に大きくなければなりません。
 */
int is_peak(int r, int c) {
    // TODO: 8つの隣接セルの相対位置を定義してください
    // (北、南、東、西、および4つの対角線)。
    
    // 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: 入れ子のループを使用して、標準入力からグリッドの値を読み込んでください。
    
    // TODO: グリッド内のすべてのセル (i, j) を反復処理してください。
    // もし is_peak(i, j) が真であれば、その座標を保存します。
    // 出力する前に結果を保存するために、peak_r[MAXN*MAXM] や peak_c[MAXN*MAXM] 
    // のような2つの配列を使用できます。

    // TODO: ピークの総数を出力してください。
    
    // TODO: 保存された各 (行, 列) のペアを出力してください。
    // 行、次に列の順で反復処理するため、これらはすでにソートされています!

    return 0;
}

Fundamentalsのすべてのレッスン