题目描述
作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。
首都被认为是一个占地 𝐶×𝐶C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。
输入格式
第一行三个整数 𝑁,𝑀,𝐶N,M,C,表示地图的宽和长以及首都的边长。
接下来 𝑁N 行每行 𝑀M 个整数,表示了地图上每个地块的价值。价值可能为负数。
输出格式
一行两个整数 𝑋,𝑌X,Y,表示首都左上角的坐标。
#include<stdio.h>
int main ()
{
int N,M,C;
int sd;
int x,y;
int map[10][10];//地图价值数据
int sum[10][10];//前缀和
int i,j;//循环变量
scanf("%d %d %d",&N,&M,&C);//M:长(横坐标),N:宽(纵坐标)
for(i=0,j=0;j<=M;j++)
{
map[i][j]=0;
sum[i][j]=0;
}
for(j=0,i=0;i<=N;i++)
{
map[i][j]=0;
sum[i][j]=0;
}
for(i=1;i<=N;i++)//地图价值输入,并录入前缀和
{
for(j=1;j<=M;j++)
{
scanf("%d",&map[i][j]);
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j];//map[0]需要赋值吗
}
}
sd=sum[C][C];
x=1;
y=1;
for(i=1;N-i>=C-1;i++)//i代表行数
{
for(j=1;M-j>=C-1;j++)//j代表列数
{
if(sum[i+C-1][j+C-1]-sum[i-1][j+C-1]-sum[i+C-1][j-1]+sum[i-1][j-1]>sd)
{
x=i;
y=j;
sd=sum[i+C-1][j+C-1]-sum[i-1][j+C-1]-sum[i+C-1][j-1]+sum[i-1][j-1];
}
}
}
printf("%d %d",x,y);
return 0;
}
算法收获:
利用前缀和处理,可以加快效率
语言收获:
全局数组自动初始化为0
局部数组不会自动初始化为0