【BFS】山峰与山谷

题目

给出一个 n ∗ n n*n nn 的矩阵,每个点都有一个高度。
一个山峰或山谷是一个高度相等的连通块。
这个连通块周围的方格,都比山峰矮或都比山谷高。
*如果整个地图是个连通块,那么它既是山峰又是山谷。


解。

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);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/112894992