http://poj.org/problem?id=2386
经典的dfs, dfs函数的作用是, 找到W附近八连通的所有W, 并将他们置为非W,以防重复访问, 这就好像一个传染的过程.
然后程序主体遍历矩阵的每一个点, 如果某个点是W就进行dfs传染, 并对num加1.
曾经感觉最擅长的题, 刚才做起来竟然觉得生疏, 虽然过了是过了, 但没有秒杀很不爽, 我真是个沙茶.
1 #include <algorithm> 2 #include <cstdio> 3 #include <queue> 4 #include <vector> 5 #include <cstring> 6 #include <set> 7 #include <string> 8 using namespace std; 9 10 #define MAX_NUM 105 11 char ma[MAX_NUM][MAX_NUM] = {0}; 12 int N = 0; 13 int M = 0; 14 int num = 0; 15 16 void dfs(int x, int y) { 17 if (ma[x][y] == 'W') { 18 ma[x][y] = '.'; 19 dfs(x - 1, y - 1);dfs(x - 1, y);dfs(x - 1, y + 1); 20 dfs(x, y - 1); dfs(x, y + 1); 21 dfs(x + 1, y - 1);dfs(x + 1, y);dfs(x + 1, y + 1); 22 } 23 } 24 25 void slove() { 26 for (int i = 1; i <= N; ++i) { 27 for (int j = 1; j <= M; ++j) { 28 if (ma[i][j] == 'W') { 29 dfs(i, j); 30 num += 1; 31 } 32 } 33 } 34 } 35 36 int main() 37 { 38 memset(ma, 0, sizeof(ma)); 39 scanf("%d%d", &N, &M); 40 getchar(); 41 for (int i = 1; i <= N; ++i) { 42 for (int j = 1; j <= M; ++j) { 43 ma[i][j] = getchar(); 44 } 45 getchar(); 46 } 47 slove(); 48 printf("%d\n", num); 49 return 0; 50 }