题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题目大意:给定一个方格,有的点是‘@’,有的点是‘*’。若以一个‘@’为中心的3*3的矩阵中,其他‘@’和该‘@’属于同一区域。
求方格中一共有多少区域。
解题思路:dfs深搜
遍历每一个点,如果该点可以向深扩展,则分别向8个方向扩展,以此类推,直到递归结束。
递归结束后,区域数目加一,所以和该点有“关系”的点都被标记。然后判断其他可扩展的点。
代码如下:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 #define MAXN 105 6 7 int m,n; 8 char Map[MAXN][MAXN];//描述该方格 9 int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{0,-1},{1,1},{1,0},{1,-1}};//描述方向 10 11 void dfs(int x,int y) 12 { 13 Map[x][y]=‘*‘;//将每点标记为不可扩展(已经经过) 14 15 int dx,dy; 16 for(int i=0;i<8;i++)//向8个方向进行扩展 17 { 18 dx=x+dir[i][0]; 19 dy=y+dir[i][1]; 20 if(dx<0 || dx>=m || dy<0 ||dy>=n)//判断是否在方格内部 21 { 22 continue; 23 } 24 if(Map[dx][dy]==‘@‘)//如果该点可以扩展,递归 25 { 26 dfs(dx,dy); 27 } 28 } 29 } 30 31 int main() 32 { 33 int sum; 34 while(cin>>m>>n) 35 { 36 cin.get();//!!!!!!!!!!!!!!!! 37 if(m==0) break; 38 39 for(int i=0;i<m;i++) 40 { 41 for(int j=0;j<n;j++) 42 { 43 cin>>Map[i][j];//!!!!!!!!!!!!!!!! 44 } 45 cin.get();//!!!!!!!!!!!!!!!! 46 } 47 48 sum=0; 49 for(int i=0;i<m;i++)//遍历整个矩阵 50 { 51 for(int j=0;j<n;j++) 52 { 53 if(Map[i][j]==‘@‘) 54 { 55 dfs(i,j); 56 sum++; 57 } 58 } 59 } 60 printf("%d\n",sum); 61 } 62 return 0; 63 }
时间: 2024-10-13 15:59:49