JZOJ_7.15C组第四题 城市统计
Posted hszgb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ_7.15C组第四题 城市统计相关的知识,希望对你有一定的参考价值。
前言
13、14日的题被我吃掉了,有时间再吐出来。
题意
给出一个矩阵,上面有商业区和居民区,以每个点为中心,在它不超过r的直径下计算出这个矩形里每个居民区到离它最近商业区的曼哈顿距离的总和,最后输出一个矩形,上面代表每个点为矩形的答案。
思路
先用bfs求出每个居民区到最近的商业区的距离,之后n$^{2}$处理以每个点为最右下角,以(1,1)为最左下角的矩形之间的距离总和,后面n$^{2}$输出就好了。
计算答案:
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<queue>
using namespace std;
queue<int> x,y;
short dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int f[151][151],ans[151][151],c[151][151],n,t,bx,by,sx,sy,r;
void read(int &tot)
{
tot=0;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) tot=(tot<<3)+(tot<<1)+c-48,c=getchar();
}
void bfs()
{
int xx,yy,a,b;
while(!x.empty())
{
a=x.front();b=y.front();
x.pop();y.pop();
for(int i=0;i<4;i++)
{
xx=a+dx[i];yy=b+dy[i];
if(xx<1||yy<1||xx>n||yy>n||c[xx][yy]==1) continue;
c[xx][yy]=1;
f[xx][yy]=f[a][b]+1;
x.push(xx);y.push(yy);
}
}
}
int main()
{
read(t);
while (t--)
{
memset(f,0,sizeof(f));
memset(ans,0,sizeof(ans));
read(n);
read(r);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
read(c[i][j]);
if(c[i][j]) //把商业区入队
{
x.push(i);
y.push(j);
}
}
bfs();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans[i][j]=ans[i-1][j]+ans[i][j-1]+f[i][j]-ans[i-1][j-1];//处理所有的ans
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
bx=min(n,i+r);by=min(n,j+r);
sx=max(0,i-r-1);sy=max(0,j-r-1);
printf("%d ",ans[bx][by]-ans[bx][sy]-ans[sx][by]+ans[sx][sy]);
}
printf("
");
}
printf("
");
}
}
以上是关于JZOJ_7.15C组第四题 城市统计的主要内容,如果未能解决你的问题,请参考以下文章