1. 程式人生 > >HDU 1241 Oil Deposits (DFS or BFS)

HDU 1241 Oil Deposits (DFS or BFS)

ble 多少 har pri 2017年 -m tchar creat int


鏈接 : 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; }

HDU 1241 Oil Deposits (DFS or BFS)