Description
Lin老师是个潜伏的富二代,他家有个巨大的矿场,为一个 N × M N\times M N×M的矩形 如果一个点为" W W W“则说明是一个矿点,如果它相邻的八个方向也是” W W W"则属于同一个矿区。 现在Lin老师想知道这个矿场有多少个区域。
Format
Input
第一行给出 N , M N,M N,M( 0 ≤ N , M ≤ 100 0\leq N,M\leq100 0≤N,M≤100) 接下来N行M列,描述这个矩形," W W W“代表为矿点,” . . ."代表是空地
Output
这个矿场有多少个区域。
Samples
输入数据1
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出数据1
3
这么简单,应该不需要思路吧
见代码中注释部分。
CODE
#include<bits/stdc++.h>
using namespace std;
int n,m,dx[10]={0,-1,-1,-1,0,0,1,1,1},ans;//dx表示行的偏移
int dy[10]={0,-1,0,1,-1,1,-1,0,1};//dy表示列的偏移
char ch;
int flag[110][110];
bool pd(int x,int y){//判断是否越界
return(x>=1&&x<=n&&y>=1&&y<=m);
}
void dfs(int i,int j){//递归,是矿区的地方时执行,否则程序结束
flag[i][j]=2;//防止一直递归(想想,为什么)
for(int k=1;k<=8;k++){
int x=i+dx[k],y=j+dy[k];//此时行和列分别是多少
if(pd(x,y)&&flag[x][y]==0)
dfs(x,y);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>ch;
if(ch=='.')flag[i][j]=1;//输入并转换
if(ch=='W')flag[i][j]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(flag[i][j]==0){
dfs(i,j);
ans++;//无论如何,只要它是个矿点就加1
}
printf("%d\n",ans);
return 0;
}