(コンテストのレビュー)2020年広公工科大学の最初の毎月のACMコンテスト-問題G:ヤンコスターはクラムスクールに行かない

トピック

説明

ディオの息子ロンロンは一日中ヤンコスターになりたいと思っており、ディオは彼のパフォーマンスが低下するのを心配しています。城太郎さんが開校したクラムスクールにロンロンを通わせることにした。ロンロンの夢を聞いたジョー太郎は感動し、次の研究ですべての質問に正解できれば、ヤンコスターだった帽子(戦争でダメージを受けたバージョン)を差し上げます。
Rongrongは、海洋学を真剣に研究してくれたJoTaro氏に非常に感謝しています。
Jo Taroは、n * mのサイズの2次元チャートを作成します。チャートにはk個の生物学的システムがあり、各生物学的システムは数字で表されます。このqの質問は4つの値x1、x2、y1、y2を与え、
  (x1、y1)、(x1、y2)、(x2、y1)、(x2、y2)と長方形の範囲の数を計算する必要があります。

Rongrongの代理人として、Rongrongがこれらの問題を解決するのを手伝ってくれませんか?

入力

最初の行に3つの整数n、m、kを入力します。n* m(1 <= n、m <= 1000)はチャートのサイズを表し、k(1 <= k <= 1000)はチャートの生物系を表します。数。

次のk行では、各行に3つの整数x、y、vが含まれており、位置(x、y)(1 <= x <= n、1 <= y <= m)に生物系v(1 <=)があることを示しています。 v <= 1000)。

次の行にq(1 <= q <= 1000)と入力します。これは、q個の質問があることを意味します。

次の行qで、x1、x2、y1、およびy2を表す4つの整数を各行に入力します。ここで(1 <= x1、x2 <= n、1 <= y1、y2 <= m)

出力

質問ごとに、この質問への回答を示す番号を各行に出力します。

サンプル入力

3 3 2
1 1 1
2 2 3
3
1 2 1 1
1 2 1 2
1 2 2 2

サンプル出力

1
4
3

問題分析

私は2ヶ月間cを書いていません。これほど多くの単語を見るのは本当に少し恥ずかしいことです。だが!言葉は多いようですが、質問の意味を理解するのは難しくありません。

二次元図を初めて見たとき、すぐに二次元配列を使うことを考えました。(動的アプリケーションは解放するのを忘れがちです。ここでは範囲に応じて直接1000が与えられます)
さらに、配列の各要素の値として使用できる生物学的システムあります(最初は3次元配列を考えていましたが)

次に、2次元配列の各要素を0に初期化し、座標の対応する場所に従って値(生物系の数)を割り当てるだけです。

最後に、フレーム合計の2次元配列サイズは、指定された2つの座標によって決定され(x1、x2、y1、y2のサイズは、forループの記述方法に応じて、ここで判断する必要があることに注意してください)、合計をトラバースします。それでおしまい。

アイデアフレームワークのリストは次のとおり
です。1。2次元配列が定義され、0に初期化されます
。2。入力に従って割り当てられます
。3。座標に従って範囲を設定します
。4。トラバースして合計します。

ACコード

#include <stdio.h>

int main() {
    
    
    int n,m;
    int k;
    scanf("%d %d %d",&n,&m,&k);
    int x,y;
    int v[1000][1000]={
    
    0};
    //二维数组定义并初始化为0
    for (int i = 0; i < k; ++i) {
    
    
        scanf("%d %d",&x,&y);
        scanf("%d",&v[x][y]);
        //根据输入进行赋值
    }
    int q;
    scanf("%d",&q);
    for (int j = 0; j < q; ++j) {
    
    
        int x1,x2,y1,y2;
        scanf("%d %d %d %d",&x1,&x2,&y1,&y2);
        int tool=1;
        if(x1>x2){
    
        //这里做x还有y的比较
            tool=x1;  //是为了下面for循环做铺垫
            x1=x2;
            x2=tool;
        }
        if(y1>y2){
    
    
            tool=y1;
            y1=y2;
            y2=tool;
        }
        int num=0;
        //根据坐标框定范围
        for (int z = x1; z <= x2; ++z) {
    
    
            for (int p = y1; p <= y2; ++p) {
    
    
                num+=v[z][p];
            }
        }
        //遍历求和
        printf("%d\n",num);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_49894103/article/details/109148306