# UVA 572 - Oil Deposits ### 題意: GeoSurvComp 每次會調查一大片矩形土地,將其劃分成許多方格區塊(grid)。 接著使用感應設備來逐一分析每一塊土地,判定該格是否含有石油。 一塊含有石油的格子稱為「油井」(pocket)。 如果兩塊油井是相鄰的,則它們屬於同一個油田(oil deposit)。 你的工作是:判斷一個 grid 中總共有多少個不同的油田。 ### Sample Input: 輸入包含一個或多個地圖。 每組測資的第一行有兩個整數 m、n,代表地圖的行數和列數。(1 ≤ m ≤ 100, 1 ≤ n ≤ 100) m = 0 時,輸入結束。 接下來會有 m 行,每行包含 n 個字元,每個字元代表一塊地: * '*' 表示這塊地不含油。 * '@' 表示這塊地是一塊油井。 ```= 1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0 ``` ### Sample Output: 對每張地圖,輸出該地圖中有多少個不同的油田。 ==若兩塊油井橫向、縱向或斜向相鄰,就屬於同一個油田。== ```= 0 1 2 2 ``` ### 程式碼: 遇到油井就去跑 DFS(跑完記得標記跑完,我是直接殺掉),跑幾次就代表有幾個油田。 ```cpp= #include <bits/stdc++.h> #define vvi vector<vector<int>> using namespace std; vvi dir = {{1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}}; void DFS(vvi& g, int i, int j, int m, int n){ // 本來忘記&,會直接無限迴圈 XD g[i][j] = 0; for (int k = 0; k < 8; k++) { int tmpi = i + dir[k][0]; int tmpj = j + dir[k][1]; if (tmpi >= m || tmpj >= n || tmpi < 0 || tmpj < 0) continue; if (g[tmpi][tmpj] == 1) DFS(g, tmpi, tmpj, m, n); } return; } int main(){ int m, n; char c; while(cin >> m >> n && m != 0) { vvi g(m, vector<int>(n, 0)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> c; if (c == '@') g[i][j] = 1; } } int cnt = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g[i][j] == 1){ DFS(g, i, j, m, n); cnt++; } } } cout << cnt << endl; } return 0; } ```