题目背景
baingbaboom正在往北边跑!!!
题目描述
现在在一张N*M的地图上有K只babingbaboom!!!对于一张地图上的点都有一个 h_{i,j}hi,j 来表示这个地方的高度。现在这些babingbaboom都想要跑到北边的一个山坡上。求出离每一个babingbaboom最近的靠北的山。
补充定义:
山:
山的周围没有比它更高的地方。(四联通)
在北边:
令Babingbaboom的坐标为A(a,b)A(a,b),山的坐标为B(x,y)B(x,y),山在Babingbaboom的北边当且仅当dis_{A,B}==a-xdisA,B==a−x
切比雪夫距离:
A(x_1,y_1) qquad B(x_2,y_2) : qquad dis_{A,B}=max(|x_1 - x_2|, |y_1 - y_2|)A(x1,y1)B(x2,y2):disA,B=max(∣x1−x2∣,∣y1−y2∣)
输入格式
第1行三个正整数N,M,K。 第2-N+1行每行有M个正整数 h_{i,j}hi,j 。 第N+2-N+K+1行每行有两个正整数X_i,Y_i表示每一个babingbaboom的坐标。
输出格式
K行。如果对于每一个babingbaboom存在这样的最近的山(切比雪夫距离),就输出这个babingbaboom到山的切比雪夫距离;否则输出“Pool Babingbaboom!”(不要引号!(我知道可怜的是Poor,但是我就爱写Pool))
输入输出样例
5 5 5 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 1 2 2 3 3 4 4 5 5 1
Pool Babingbaboom! Pool Babingbaboom! 1 2 0
说明/提示
1 leqslant N,M leqslant 1e31⩽N,M⩽1e3
1 leqslant K leqslant 1e51⩽K⩽1e5
1 leqslant h_{i,j} leqslant 1e91⩽hi,j⩽1e9
数据有梯度!
样例图片(星代表一个Babingbaboom,红色代表一个山): (竖的是x,横的是y。画的时候没注意,很抱
歉。)
#include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,k,h[1005][1005],f[1005][1005]; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-'){ w=-1; } ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*w; } int main(){ n=read(); m=read(); k=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ h[i][j]=read(); } } memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(h[i][j]>h[i-1][j]&&h[i][j]>h[i+1][j]&&h[i][j]>h[i][j+1]&&h[i][j]>h[i][j-1]){ f[i][j]=0; } else{ f[i][j]=min(f[i-1][j],min(f[i-1][j-1],f[i-1][j+1]))+1; } } } for(int i=1;i<=k;i++){ int x,y; x=read(); y=read(); if(f[x][y]>10000){ printf("Pool Babingbaboom! "); } else{ printf("%d ",f[x][y]); } } }