EOJ-2518 Guarding the Farm

http://acm.cs.ecnu.edu.cn/problem.php?problemid=2518

题意:给出一张图,求出其hilltop的个数。

hilltop的定义:一片相同高度的区域,而周围的区域的高度都小于它,或处于图的边缘。

周围的区域:与某片区域高度不相同的区域,且范围是向八个方向延伸。

DFS搜索某个点,并记录,搜索周围八个方向,若有一个点大于它则这块区域不是HILLTOP。标记周围所有与它高度相同的点防止重复搜索。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int mat[105][75];
 6 bool v[105][75];
 7 int n,m;
 8 bool hilltop;                                   //判断是否为hilltop
 9 void dfs(int x,int y,int temp){
10     if(x<0 || x>=n || y<0 || y>=m) return ;     //在图边缘也满足要求
11     if(mat[x][y]<temp) return ;
12     if(mat[x][y]>temp){hilltop=0;return ;}      //大于时则不满足
13     if(v[x][y]) return ;
14     v[x][y]=1;                                  //将所有相同高度的区域都标记
15     dfs(x+1,y,temp);                            //向八个方向延伸
16     dfs(x-1,y,temp);
17     dfs(x,y+1,temp);
18     dfs(x,y-1,temp);
19     dfs(x+1,y+1,temp);
20     dfs(x+1,y-1,temp);
21     dfs(x-1,y+1,temp);
22     dfs(x-1,y-1,temp);
23 }
24 int main(){
25     while(~scanf("%d%d",&n,&m)){
26         for(int i=0;i<n;i++)
27             for(int j=0;j<m;j++)
28                 scanf("%d",&mat[i][j]);
29         memset(v,0,sizeof(v));
30         int cnt=0;
31         for(int i=0;i<n;i++)
32             for(int j=0;j<m;j++)
33                 if(v[i][j]==0){                 //未标记的点才进行搜索
34                     hilltop=1;
35                     dfs(i,j,mat[i][j]);
36                     if(hilltop)cnt++;
37                 }
38         printf("%d
",cnt);
39     }
40     return 0;
41 }
View Code
原文地址:https://www.cnblogs.com/KimKyeYu/p/3179324.html