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组第四题 城市统计的主要内容,如果未能解决你的问题,请参考以下文章

普及C组第四题(8.18)

2002普及组第四题过河卒

Hanoi双塔问题(NOIP2007 普及组第四题)

魔法阵(NOIP2016 普及组第四题)

文化之旅(NOIP2012普及组第四题)

子矩阵(NOIP2014 普及组第四题)