dfs|codevs【1569】最佳绿草

题目描述
贝茜正计划着这一天如何美美地咀嚼春天的绿草,远望着农民约翰钟爱的并被分
割为R (1 <= R <= 100) 行和 C (1 <= C <= 100) 列的草场。她想去数一数草场
有多少个草丛。
每个草丛在地图上用’#‘来表示,或者两个’#'连在一起(但不是在一个对角线),
给出草场地图,请告诉贝茜草场上一共有多少个草丛。
例如,下面有一张草场地图 R=5, C=6:
.#…
…#…
…#…#
…##.
.#…
这个草场一共有5个草丛。(1,2); (2,3)+(3+3); (3,6); (4,4)+(4,5); (5,2)
输入描述
第 1 行: 2个用空格隔开的整数 R , C
第 2 至 R+1 行: 草场地图信息
输出描述
草场上草丛的总个数。
【dfs|codevs【1569】最佳绿草】样例输入
5 6
.#…
…#…
…#…#
…##.
.#…
样例输出
5

#include #include using namespace std; #define N 100 + 10 int dir[][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int n,m; char a[N][N]; int ans; bool isValid(int x,int y) { return (x >= 0 && x < n) && (y >= 0 && y < m) && (a[x][y] == '#'); } int dfs(int x,int y) { if(isValid(x,y)) { a[x][y] = '.'; for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; dfs(nx,ny); } return 1; } return 0; } int main() { scanf("%d%d",&n,&m); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> a[i][j]; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) ans += dfs(i,j); //从左到右,从上到下找草地,并在该草地上深搜相连的草地 printf("%d\n",ans); return 0; }

    推荐阅读