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