#include <stdio.h>
char maze[101][101];//矩形位置信息
int mark[101][101];//标记信息
int m,n;//矩形长宽
int go[][2]={
1,0,
-1,0,
0,1,
0,-1,
1,1,
-1,1,
1,-1,
-1,-1
};//八个方向
void dfs(int x,int y){
for(int i=0;i<8;i++){
int nx=x+go[i][0];
int ny=y+go[i][1];//该点按八个方向的移动
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]=='@'&&!mark[nx][ny]){
//超出整个位置范围跳过 该位置不是@跳过 该位置已经被标记查过了跳过
mark[nx][ny]=true;//标记该点
// printf("%d-%d-%c\n",nx,ny,maze[nx][ny]);验证标记
dfs(nx,ny); //递归查相邻坐标
}
}
return;//退回
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&(m!=0||n!=0)){//输入长宽
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
mark[i][j]=false;
scanf("%c",&maze[i][j]);
}
getchar();
}
int ans=0;//存放结果
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if((!mark[i][j])&&maze[i][j]=='@'){
dfs(i,j);//若该位置未被标记,遍历该元素
ans++;
}
}
printf("%d\n\n",ans);
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++)
// printf("%c",maze[i][j]);
// printf("\n");
// }验证输出
}
return 0;
}
- 在输入的时候,由于每一行输入后都会有一个换行,所以要在第一层循环最后加一个getchar来接受输入的换行
1 1
*
3 5
@@*
@
@@*
1 8
@@***@
5 5
****@
@@@
@**@
@@@@
@@**@
0 0