码迷,mamicode.com
首页 > 其他好文 > 详细

专题一 简单搜索 Problem L

时间:2015-07-14 00:05:27      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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 }
View Code

 

专题一 简单搜索 Problem L

标签:

原文地址:http://www.cnblogs.com/Page3/p/4644196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!