题目大意:
GeoSurvComp地质调查公司负责探测地下石油储藏。GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。
题解:
逐行寻找“@”,若找到执行DFS把与此“@”相连的“@”(包括此“@”)全部置为“*”。
#include <iostream>
#include <cstring>
using namespace std;
#define ms(a, b) memset(a, b, sizeof(a))
int num, n, m;
char mat[510][510];
void dfs(int x, int y) {
if (x < 0 || y < 0 || x > n || y > m) return;
mat[x][y] = '*';
if (mat[x + 1][y + 1] == '@') dfs(x + 1, y + 1);
if (mat[x - 1][y - 1] == '@') dfs(x - 1, y - 1);
if (mat[x + 1][y - 1] == '@') dfs(x + 1, y - 1);
if (mat[x - 1][y + 1] == '@') dfs(x - 1, y + 1);
if (mat[x][y + 1] == '@') dfs(x, y + 1);
if (mat[x][y - 1] == '@') dfs(x, y - 1);
if (mat[x + 1][y] == '@') dfs(x + 1, y);
if (mat[x - 1][y] == '@') dfs(x - 1, y);
}
int main() {
while (cin >> n >> m) {
if (!n && !m) {
break;
}
ms(mat, 0);
num = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> mat[i][j];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (mat[i][j] == '@') {
++num;
dfs(i, j);
}
}
}
cout << num << endl;
}
return 0;
}