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\n",cnt); 39 } 40 return 0; 41 }