HDOJ-4500小Qシリーズストーリー-キックアスの逆襲

8304 ワード

小Qシリーズストーリー——キックアスの逆襲
Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1240    Accepted Submission(s): 478
Problem Description
普通の本科を卒業したQさんはずっとベテランキックアスだと自称していて、学校が知られていないだけでなく、彼自身もこの普通の学校では無名だった--卒業が近づくまで、クラスの5輪の金の花の中の2人は彼と話をしたことがない!
誰がまた思い付くことができて、このような目立たないQは重い面接の一環を経験した後で、意外にも願い通りに念願のテンセント会社に参加しました!ニュースが広まったばかりの数日、彼らのクラスや学院全体で話題になっていました.もしこの時、Qさんが誰なのか分からないと言ったら、あなたはみんな怪物にされます.
まさに野百合にも春があり、キックアスにも逆襲の日がある!
  
テンセントビルに出勤したばかりの数日、Qさんの目の中のすべてはそんなに新鮮で、毎日見ているフロントMMさえ彼の目の中で太っていてかわいいです.Qさんはこのように緊張と興奮の中で一日また一日を過ごして、毎日勤勉でまじめで慎重で、主管に良い印象を残して、このせっかくの仕事の機会を失わないようにしたいと思っています.
しばらくの时间の后で、仕事の环境と同僚に対する熟知に従って、小さいQは次第にリラックスして、仕事の隙间で、彼は自分の仕事の环境を详しく観察して、全体のスタジオが1つのN行M列の矩形の配置であることを発见して、あるいはキックアスの本性が次第に暴露するため、彼はまたひそかにすべての同僚に心の中で魅力の値の採点を行いました(男女を区別するために、男子学生はすべて負の整数で表し、女子学生はすべて正の整数で表す).
今、小Qはすべての人のデータを記録し、位置の価値を定義します.
1、一つの位置の価値はその上下左右の4人の隣人の魅力値と関係がある(隣の位置については、その存在の隣人だけを考慮する).
2、ある位置の隣人とその位置の主人の性別が異なる場合、総点に隣人の魅力値の絶対値を加え、そうでなければ減算する.
3、周囲のすべての隣人に対するデータ処理後、最終的な得点はこの位置の最終的な得点であり、得点が高いほど、その位置が良い.
Qさんがどこが一番いい位置なのか計算してもらえますか?
 
 
Input
複数のテストデータを含む入力;
各テストデータのセットの最初の行は、2つの整数NとMを含み、スタジオのレイアウトがN行M列であることを示す.
次のN行は、行ごとにM個の整数があり、それぞれ対応する位置の従業員の魅力値データKiを表し、正の整数は女性の魅力値を表し、負の整数は男性の魅力値を表す.
NとMが0の場合は入力データが終了することを示す.
[Technical Specification]
N<=20
M<=20
-100<=Ki<=100
 
 
Output
最適な位置の行列番号と対応する得点を計算して出力してください.得点が一番高い位置が複数ある場合は、行番号が一番小さいものを出力してください.行番号が同じなら、列番号を比較して、列番号が一番小さいものだけを出力してください.
 
 
Sample Input
2 3 5 -4 3 -6 3 7 0 0
 
 
Sample Output
1 2 11
 
 
Source
2013テンセントプログラミングマラソン初戦〇場(3月20日)
 
 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 int map[25][25];
 8 
 9 
10 int cal(int a, int b)
11 {
12     if(a * b < 0)
13         return abs(b);
14     return (-1) * abs(b);
15 }
16 int main()
17 {
18     int n, m, max, t, row, col;
19     while(scanf("%d%d", &n, &m), m || n)
20     {
21         memset(map, 0, sizeof(map));
22         max = -1000;
23         row = col = 1;
24         for(int i = 1; i <= n; ++i)
25             for(int j = 1; j <= m; ++j)
26                 scanf("%d", &map[i][j]);
27         for(int i = 1; i <= n; ++i)
28             for(int j = 1; j <= m; ++j)
29             {
30                 t = 0;
31                 t += cal(map[i][j], map[i-1][j]);
32                 t += cal(map[i][j], map[i+1][j]);
33                 t += cal(map[i][j], map[i][j-1]);
34                 t += cal(map[i][j], map[i][j+1]);
35                 if(t > max)
36                 {
37                     max = t;
38                     col = j;
39                     row = i;
40                 }
41             }
42         printf("%d %d %d
", row, col, max); 43 } 44 return 0; 45 }