# HDU 1241 Oil Deposits (DFS or BFS)

**鏈接 : ** Here!

**思路 : ** 搜索判斷連通塊個數, 所以 \$DFS\$ 或則 \$BFS\$ 都行嘍...., 首先記錄一下整個地圖中所有\$Oil\$的個數, 然後遍歷整個地圖, 從油田開始搜索它所能連通多少塊其他油田, 只需要把它所連通的油田個數減去, 就ok了

``````/*************************************************************************
> File Name: E.cpp
> Author:
> Mail:
> Created Time: 2017年11月26日 星期日 10時51分05秒
************************************************************************/

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

#define MAX_N 150
int n, m;
int total_num;
int  vis[MAX_N][MAX_N];
int dx[8] = {0, 0, -1, 1, 1, -1, 1, -1};
int dy[8] = {-1, 1, 0, 0, 1, -1, -1, 1};
char G[MAX_N][MAX_N];

void dfs(int x, int y) {
vis[x][y] = 1;
for (int i = 0 ; i < 8 ; ++i) {
int now_x = x + dx[i];
int now_y = y + dy[i];
if (vis[now_x][now_y]) continue;
if (now_x < 0 || now_x >= n || now_y < 0 || now_y >= m) continue;
if (G[now_x][now_y] != '@') continue;
vis[now_x][now_y] = 1;
--total_num;
dfs(now_x, now_y);
}
}
void solve() {
for (int i = 0 ; i < n ; ++i) {
for (int j = 0 ; j < m ; ++j) {
if (G[i][j] == '@') {
++total_num;
}
}
}
memset(vis, 0, sizeof(vis));
for (int i = 0 ; i < n ; ++i) {
for (int j = 0 ; j < m ; ++j) {
if (G[i][j] != '@' || vis[i][j]) continue;
dfs(i, j);
}
}
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
if (n == 0 && m == 0) break;
memset(G, 0, sizeof(G));
total_num = 0;
for (int i = 0 ; i < n ; ++i) {
getchar();
scanf("%s", G[i]);
}
solve();
printf("%d\n", total_num);
}
return 0;
}
``````