题意:计算每个座位的value值,根据坐在该座位的队伍长度与其上下左右方向的四个队伍长度比较。若该位置的队伍长度比一个方向的长度大,则权值减去长度差的绝对值;反之则加长度差的绝对值。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main(){
int T;
int N,M;
int s[25][25];
int v[25][25];
int i,j;
int a,b;
int ma,ma_i,ma_j;
int ca=0;
int k;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
for(i=0;i<N;++i){
for(j=0;j<M;++j){
scanf("%d",&s[i][j]);
}
}
memset(v,0,sizeof(v));
for(i=0;i<N;++i){
for(j=0;j<M;++j){
for(k=0;k<4;++k){
a=i+dir[k][0];
b=j+dir[k][1];
if(a<0||b<0||a>=N||b>=M){
v[i][j]-=1;
continue;
}
if(s[a][b]>s[i][j]){
v[i][j]=v[i][j]+(s[a][b]-s[i][j]);
}
else{
v[i][j]=v[i][j]-(s[i][j]-s[a][b]);
}
}
}
}
ma=v[0][0];
ma_i=0;
ma_j=0;
for(i=0;i<N;++i){
for(j=0;j<M;++j){
if(v[i][j]>=ma){
ma=v[i][j];
ma_i=i;
ma_j=j;
}
}
}
printf("Case %d: %d %d %d\n",++ca,ma,ma_i+1,ma_j+1);
}
return 0;
}