标签:printf 矩阵 tin fonts type i++ blog 图片 sdi
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("\n");
}
printf("\n");
}
}
标签:printf 矩阵 tin fonts type i++ blog 图片 sdi
原文地址:https://www.cnblogs.com/HSZGB/p/9314939.html