2801 Problem A Lake Counting

题目描述

题意:有一块N×M的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?

 

输入

第一行为N,M(1≤N,M≤110)。

下面为N*M的土地示意图。

输出

一行,共有的水洼数。

 

样例输入

10 12

W........WW.

.WWW.....WWW

....WW...WW.

.........WW.

.........W..

..W......W..

.W.W.....WW.

 

.W.W......W.

..W.......W.

样例输出

3

题目类型

DFS;

 

代码

#include<bits/stdc++.h>

using namespace std;

/*用sum记录水洼数量,先用ma[][]记录这个地图,输入时将W记为1,其余不管。然后开始从左上角开始遍历数组元素。

便利某一个元素时,如果其值为一,先设为零,就沿着它的八个方向寻找有水的节点,并将找到的节点也设为零,寻找它周围有水的节点,不断重复。

当周围没有有水的节点时,说明这个水洼的所有点都已走过,并将值改为了0,这时可以将sum++.*/

int m,n,sum=0,ma[115][115];

int dir[8][2]={0,1,1,0,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1};

void dfs(int x,int y){

       for(int i=0;i<8;i++){

              int xx=x+dir[i][0],yy=y+dir[i][1];

              if(xx<n&&xx>=0&&yy<m&&yy>=0&&ma[xx][yy]){

                     ma[xx][yy]=0;

                     dfs(xx,yy);

              }

                    

       }

}

int main(void){

       char x;

       scanf("%d%d",&n,&m);

       for(int i=0;i<n;i++){

              getchar();

              for(int j=0;j<m;j++){

                     scanf("%c",&x);

                     if(x=='W') ma[i][j]=1;

              }

       }

 

       for(int i=0;i<n;i++){

              for(int j=0;j<m;j++){

                     if(ma[i][j]) {

                            ma[i][j]=0;

                            sum++;dfs(i,j);

                           

                     }

              }

       }

       printf("%d",sum);

}

上一篇:53. 最大子序和


下一篇:Springboot集成MapperFactory(ma.glasnost.orika.MapperFactory)类属性复制