您的位置:首页 > 其它

DFS 水题Lake Counting

2017-07-20 01:18 197 查看
由于最近的降雨,水已经在农民约翰的田野中的各个地方聚集,这是由N×M(1 <= N <= 100; 1 <= M <= 100)广场的矩形表示的。 每个广场都有水('W')或干地(''')。 农民约翰想知道在他的领域已经形成了多少个池塘。 一个池塘是连接在一起的正方形的水,在那里一个正方形被认为是邻近所有八个邻居

给出了约翰农场的图表,确定他有多少池塘。

输入

*行1:两个空格分隔的整数:N和M <br> <br> *行2..N + 1:每行代表一行农夫约翰字段的M个字符。 每个角色都是“W”或“。”。 角色之间没有空格。

产量

第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.

样品输出

3

刚开始不懂题目的意思,上网百度还是看不懂,然后问了同学,发现很水,就是找连在一起的块数,样例中即有3个(联通规则为9宫格的中心可以到其他的8个位置)

DFS直接解决,注意9宫格中心和其他8个格子在坐标的关系

void DFS(int row,int col)
{
if(1>row&&row>N&&col<1&&col>M)
return ;
s[row][col]='.';
for(int i=0;i<8;i++)
{
int x=row+dir[i].x;
int y=col+dir[i].y;
if(s[x][y]=='W'){
DFS(x,y);
}

}
}
int main()
{

cin>>N>>M;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
cin>>s[i][j];
int cnt=0;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
if(s[i][j]=='W')
{
DFS(i,j);
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: