这个题的模板 也可以AC 另两个题 ,代码意思都是差不多的
Red and Black(找黑砖的个数)点击打开链接
Oil Deposits(计算油田的个数)点击打开链接
Description
Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
Output
* Line 1: The number of ponds in Farmer John's field.
Sample Input
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
Sample Output
3
Hint
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
大致题意
有一个大小为N*M的园子,雨后积了很多水。八连通的积水被认为是在一起的。请求出园子里共有多少个水洼?(八连通是指下图中相对.的8 部分)
www
w.w
www
从任意的'W'开始,不停地把邻接的部分用'.'代替,一次DFS(深度优先遍历)遍历后,与初始的这个 W 所连接的所有 'W' 都会被替换成 '.',因此直到图中没有 'W'为止,总共进行 DFS 的次数即为积水的次数。
代码如下:
第一种方法;
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[1001][1001];
int n,m;
void DFS(int x,int y)
{
int i,j,b,c;
for(i=-1;i<=1;i++){
for(j=-1;j<=1;j++){
b=i+x;//代表了八个方向 (i-1,j-1) (i-1,j) (i-1,j+1) (i,j-1)
c=y+j;// (i,j+1) (i+1,j-1) (i+1,j) (i+1,j+1)
if(b>=0&&b<n&&y>=0&&y<m&&a[b][c]=='W')
{
a[b][c]='.';//如果改点是 ’W' 的话 就另 该点是 '.' 以后也不访问他
DFS(b,c);// 去搜索该点
}
}
}
}
int main()
{
int i,j,flag=0;
while(scanf("%d %d",&n,&m)!=EOF){
memset(a,'0',sizeof(a));
flag=0;
for(i=0;i<=n-1;i++)
scanf("%s",a[i]);
for(i=0;i<=n-1;i++){
for(j=0;j<=m-1;j++){
if(a[i][j]=='W'){
flag++;//遇见一个水洼 就加加
DFS(i,j);//去搜索这一点的八个方向
}
}
}
printf("%d\n",flag);
}
}
第二种方法:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[1001][1001];
int n,m;
void DFS(int i,int j)
{
if(i>=0&&i<n&&j>=0&&j<m&&a[i][j]=='W'){
a[i][j]='.';//相比于第一种,这里用了八个 DFS,第一种用了循环来表示八个方向
DFS(i-1,j-1);
DFS(i-1,j);
DFS(i-1,j+1);
DFS(i,j-1);
DFS(i,j+1);
DFS(i+1,j-1);
DFS(i+1,j);
DFS(i+1,j+1);
}
}
int main()
{
int i,j,flag=0;
while(scanf("%d %d",&n,&m)!=EOF){
memset(a,'0',sizeof(a));
flag=0;
for(i=0;i<=n-1;i++)
scanf("%s",a[i]);
for(i=0;i<=n-1;i++){
for(j=0;j<=m-1;j++){
if(a[i][j]=='W'){
flag++;
DFS(i,j);
}
}
}
printf("%d\n",flag);
}
}