本题是一道连通块的入门题,用来练手,后续还会更新连通块的题目。
本题大意:一个n * m 的陆地上面有很多水洼,让你统计水洼的个数并输出。
本题思路:按照顺序遍历陆地,如果发现水洼就将它的八连块都进行探索,发现水洼就继续探索,直到一片大水洼都被探索完,就继续进行其他搜索,DFS。
代码:
1 #include <cstdio> 2 using namespace std; 3 4 const int maxn = 100 + 5; 5 char field[maxn][maxn]; 6 int n, m, ans; 7 8 void dfs(int u, int v) { 9 field[u][v] = '.';//将正在探索的水洼变为陆地,方便后续查询 10 for(int dx = -1; dx <= 1; dx ++) { 11 for(int dy = -1; dy <=1; dy ++) { 12 int nx = u + dx, ny = v + dy; 13 if(nx >= 0 && nx < n && ny >= 0 && ny < m && field[nx][ny] == 'W') 14 dfs(nx, ny); 15 } 16 } 17 } 18 19 int main () { 20 ans = 0; 21 scanf("%d %d", &n, &m); 22 getchar(); 23 for(int i = 0; i < n; i ++) { 24 for(int j = 0; j < m; j ++) 25 field[i][j] = getchar(); 26 getchar(); 27 } 28 for(int i = 0; i < n; i ++) 29 for(int j = 0; j < m; j ++) 30 if(field[i][j] == 'W') {//如果一个地方为水洼,则将和他连在一起的所有水洼都变为陆地,方便后续的统计 31 dfs(i, j); 32 ans ++; 33 } 34 printf("%d ", ans); 35 return 0; 36 }
还有一道题HDU1241和这道题一模一样,建议大家二选一即可。