TZOJ 3286:湖计数 深搜
描述
由于最近的降雨,在 Farmer John 的田地的各个地方积水,由 N x M (1 <= N <= 100; 1 <= M <= 100) 正方形组成的矩形表示。每个方格包含水('W')或旱地('.')。农夫约翰想弄清楚他的田地里形成了多少池塘。池塘是一组相连的正方形,里面有水,其中一个正方形被认为与其所有八个邻居相邻。
给定农民约翰的田地图,确定他有多少池塘。
输入
* 第 1 行:两个以空格分隔的整数:N 和 M
* 第 2..N+1 行:每行 M 个字符代表 Farmer John 的田地的一行。每个字符都是“W”或“.”。字符之间没有空格。
输出
* 第 1 行:Farmer John 田地中的池塘数量。
样例输入
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
提示
输出细节:
共有三个池塘:一个在左上角,一个在左下角,一个在右侧。
AC感想:
深搜模板,输入地图-初始化-dfs开搜-将所有可标记点标记-记录答案
dfs:找下一步的坐标-判断是否越界-判断是否可走-可走则标记下一步,以下一步为起点继续深搜
#include<iostream> #include<stdio.h> #include<algorithm> #include<cstring> using namespace std; struct node{ int x,y,step; }; node a[3000]; char mmp[101][101]; int sum = 0,f,have=0; int n,m; int sx,sy; int book[101][101]; int nex[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; void dfs(int x,int y) { int tx,ty; book[x][y] = 1; for(int i=0;i<8;i++) { tx = x+nex[i][0]; ty = y+nex[i][1]; if(tx<1||tx>n||ty<1||ty>m)continue; if(mmp[tx][ty]!='.'&&book[tx][ty]!=1) { book[tx][ty]=1; dfs(tx,ty); } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mmp[i][j]; } getchar(); } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mmp[i][j]=='W'&&book[i][j]!=1) { sx = i; sy = j; have = 1; dfs(sx,sy); sum++; } } } cout<<sum<<endl; return 0; }