题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/L

题意:

       输入一个m行n列的字符矩阵,相邻的“@”(横、竖或者对角线方向,即有8个方向)属于同一块,统计字符“@”可以有多少块。(输入0结束)

       案例:

       input

       1 1

       *

       3 5

       *@*@*

       **@**

       *@*@*

       1 8

       @@****@*

       0 0

       output

       0

       1

       2

思路分析:

       利用DFS广搜。

       返回条件为不出区域,不是到过的,不是@。

源代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #define maxn 105
 4 using namespace std;
 5 int n,m,idx[maxn][maxn];
 6 char pic[maxn][maxn];
 7 void dfs(int x,int y,int c)               //搜索
 8 {
 9     if(x<0||x>=m||y<0||y>=n)return;
10     if(idx[x][y]>0||pic[x][y]!='@')return;
11     idx[x][y]=c;
12     for(int i=-1;i<=1;i++)              //8个方向
13         for(int j=-1;j<=1;j++)
14             if(i!=0||j!=0)dfs(x+i,y+j,c);
15 }
16 int main()
17 {
18     int i,j,count;
19     cin>>m>>n;
20     while(m)
21     {
22         count=0;
23         for(i=0;i<m;i++)
24             for(j=0;j<n;j++)
25                 cin>>pic[i][j];
26         memset(idx,0,sizeof(idx));
27         for(i=0;i<m;i++)
28             for(j=0;j<n;j++)
29                 if(idx[i][j]==0&&pic[i][j]=='@')dfs(i,j,++count);
30         cout<<count<<endl;
31         cin>>m>>n;
32     }
33     return 0;
34 }

 

posted on 2015-07-29 08:56  尘埃。  阅读(223)  评论(0编辑  收藏  举报