往四个方向深搜索即可。重点理解递归就可,递归是系统自己调用一个栈。
它会1,将所有的实在参数,返回地址等信息给调用函数保存。
2,为被调用的函数分配内存。
3,转移到调用函数的入口。
#include<stdio.h>
#include<string.h>
int n,m,many;
int map[55][55];
char s[55][55];
int dfs(int i,int j){
map[i][j] = 1;
if(i+1<n && s[i+1][j]=='@' &&map[i+1][j]==0) dfs(i+1,j);
if(j+1<m && s[i][j+1] == '@' && map[i][j+1]==0) dfs(i,j+1);
if(i-1>=0 && s[i-1][j]=='@' && map[i-1][j]==0) dfs(i-1,j);
if(j-1>=0 && s[i][j-1]=='@' && map[i][j-1]==0) dfs(i,j-1);
return 1;
}
int main(){
int i,j;
while(scanf("%d%d",&n,&m)!=EOF){
many = 0;
memset(map,0,sizeof(map));
for(i=0;i<n;i++) scanf("%s",s[i]);
for(i = 0;i<n;i++){
for(j=0;j<m;j++){
if(map[i][j]==0 && s[i][j]=='@') many += dfs(i,j);
}
}
printf("%d\n",many);
}
return 0;
}