题目
给出一个 n ∗ n n*n n∗n 的矩阵,每个点都有一个高度。
一个山峰或山谷是一个高度相等的连通块。
这个连通块周围的方格,都比山峰矮或都比山谷高。
*如果整个地图是个连通块,那么它既是山峰又是山谷。
解。
BFS,每走过一个点判断它旁边的点是否决定它是否山峰或山谷。
代码
#include<cstdio>
int b[1001][1001], h[1001][1001], n, sf, sg, anssf, anssg;
int fx[10] = {
0,-1,0,1,-1,+1,-1,0,1}, fy[10] = {
0,1,1,1,0,0,-1,-1,-1};
void dfs(int xx, int yy){
b[xx][yy] = 1; //标记
for(int i = 1; i <= 8; ++i){
//八个方向
int lx = xx + fx[i];
int ly = yy + fy[i];
int fw = (lx < 1 || ly < 1 || lx > n || ly > n); //是否超界
if(h[lx][ly] > h[xx][yy] && !fw) sf = 0; //在界内的高度不符合条件
if(h[lx][ly] < h[xx][yy] && !fw) sg = 0;
if(fw) continue;
if(b[lx][ly] == 0 && h[lx][ly] == h[xx][yy]) //在界内且高度相等且没走过
dfs(lx, ly);
}
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &h[i][j]);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(b[i][j] == 0){
sf = 1; sg = 1; //初始化
dfs(i,j);
anssf += sf;
anssg += sg;
}
printf("%d %d", anssf, anssg);
}