也是很简单的DFS水题,就跟求有多少连通块差不多。(只有上下左右四个方向有联通才是连通块)
#include<cstdio> #include <cstring> using namespace std; int m, n,cnt = 0; char A[101][101]; int vis[101][101]; void dfs(int i, int j) { if(i < 0|| j < 0|| i >= m|| j >= n || vis[i][j] || A[i][j] != '@') return; else { //这里当然也可以开一个dic数组用for来遍历,但是这个是我早期代码,只是做个归档故不再优化。 vis[i][j] = 1; 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);//dfs的精髓! //这道题就不需要重置了,因为油田不能重复出现 } } int main() { while(~scanf("%d%d", &m, &n) && (m+n)) { cnt = 0; memset(A, 0, sizeof(A)); memset(vis, 0, sizeof(vis)); for(int i = 0; i < m; ++i) scanf("%s", A[i]); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) if(!vis[i][j] && A[i][j] == '@') dfs(i, j),cnt++; printf("%d\n", cnt); } }