1 //理解dfs的实现,主要是回溯时的退出表现 2 #include<cstdio> 3 #include<iostream> 4 #include<cstring> 5 6 using namespace std; 7 8 const int maxn=102; 9 int n,m; 10 int visited[maxn][maxn]; 11 char map[maxn][maxn]; 12 int cnt; 13 14 void dfs(int i,int j) 15 { 16 if(i+1<n&&visited[i+1][j]==0&&map[i+1][j]=='@') 17 dfs(i+1,j); 18 else if(i-1>=0&&visited[i-1][j]==0&&map[i-1][j]=='@') 19 dfs(i-1,j); 20 else if(j-1>=0&&visited[i][j-1]==0&&map[i][j-1]=='@') 21 dfs(i,j-1); 22 else if(j+1<m&&visited[i][j+1]==0&&map[i][j+1]=='@') 23 dfs(i,j+1); 24 else if(i-1>=0&&j-1>=0&&visited[i-1][j-1]==0&&map[i-1][j-1]=='@') 25 dfs(i-1,j-1); 26 else if(i+1<n&&j+1<m&&visited[i+1][j+1]==0&&map[i+1][j+1]=='@') 27 dfs(i+1,j+1); 28 else if(i-1>=0&&j+1<m&&visited[i-1][j+1]==0&&map[i-1][j+1]=='@') 29 dfs(i-1,j+1); 30 else if(i+1<n&&j-1>=0&&visited[i+1][j-1]==0&&map[i+1][j-1]=='@') 31 dfs(i+1,j-1); 32 } 33 34 int main() 35 { 36 while(scanf("%d%d",&n,&m)!=EOF&&m) 37 { 38 cnt=0; 39 memset(visited,0,sizeof(visited)); 40 for(int i=0;i<n;i++) 41 { 42 for(int j=0;j<m;j++) 43 { 44 cin>>map[i][j]; 45 } 46 } 47 48 for(int i=0;i<n;i++) 49 { 50 for(int j=0;j<m;j++) 51 { 52 if(map[i][j]=='@'&&visited[i][j]==0) 53 { 54 dfs(i,j); 55 cnt++; 56 } 57 } 58 } 59 60 printf("%d\n",cnt); 61 } 62 return 0; 63 }