问题描述
在byteland上有一块地区,蕴藏了byteland上最珍贵的Bit矿物质。科学家们将这块地区划分成了nn个相同大小的单元格,并对每个单元格进行了考察研究:有的单元格中有丰富的Bit矿物质—科学家用1来标识;有的单元格蕴藏的矿物质很少—科学家用0来标识。
假设用W(i,j)和F(i’,j’)来分别表示两个单元格。那么它们之间的距离被定义为:max(|i - i‘|,|j - j‘|),例如W(1,3)和F(4,2)的距离为3。
鉴于可持续发展的思想和开采能力的限制,ByteLand当局计划以一块单元格为中心,开采与中心距离不超过R的所有单元格内的矿藏。为了选定一个合适的单元格作中心,当局希望能够预先了解:以任意一个单元格为中心时,开采量的情况。
于是,当局将一张矿藏地图交给你,上面的nn个单元格中包含数字0或1。你被要求根据这张矿藏地图,绘制出相应的“矿藏密度图”,分别以每块单元格为中心,计算与中心距离不超过R的所有标识为1的单元格个数。
输入文件
输入文件名:map.in
第一行有两个数字n和r(0r<n250)。
以下n行,每行n个数字。第i+1行第j个数字为单元格(i,j)的标识—0或1。
输出文件
输出文件名:map.out
输出文件有n行,每行n个数字。第i行第j个数字表示:与(i,j)距离不超过r的所有标识为1的单元格个数。
样例输入
5 1
1 0 0 0 1
1 1 1 0 0
1 0 0 0 0
0 0 0 1 1
0 1 0 0 0
样例输出
3 4 2 2 1
4 5 2 2 1
3 4 3 3 2
2 2 2 2 2
1 1 2 2 2
//求前缀和 ,s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+x;
特别要注意边界情况(在边界-1)
不能四重循环,否则严重TLE
#include<bits/stdc++.h>
using namespace std;
const int Maxn=255;
int s[Maxn][Maxn];
int ans[Maxn][Maxn];
int n,i,j,r,x;
int Xn,Xn2,Yn,Yn2;
int main()
{
freopen("map.in","r",stdin);
freopen("map.out","w",stdout);
cin>>n>>r;
memset(s,sizeof(s),0);
s[0][0]=0;
s[0][1]=0;
s[1][0]=0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
cin>>x;
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+x;
}
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{
Xn=min(i+r,n); Yn=min(j+r,n);
Xn2=max(i-r-1,0); Yn2=max(j-r-1,0);
ans[i][j]=s[Xn][Yn]-s[Xn2][Yn]-s[Xn][Yn2]+s[Xn2][Yn2];
}
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{
cout<<ans[i][j];
if (j!=n) cout<<" ";
if ((j==n) && (i!=n)) cout<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
原文地址:https://www.cnblogs.com/SandStorm/p/9313178.html