トピック
説明
ディオの息子ロンロンは一日中ヤンコスターになりたいと思っており、ディオは彼のパフォーマンスが低下するのを心配しています。城太郎さんが開校したクラムスクールにロンロンを通わせることにした。ロンロンの夢を聞いたジョー太郎は感動し、次の研究ですべての質問に正解できれば、ヤンコスターだった帽子(戦争でダメージを受けたバージョン)を差し上げます。
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;
}