UVA 572 - Oil Deposits
这是一道Depth First Search/Breadth First Search的题目。我的implementation是基于DFS的。
算法是这样的:
loop一遍这个grid:
如果grid[i][j] == '@':
对它做DFS。(这个DFS的作用是:以grid[i][j]为root
把所有跟它在同一个tree里面的字符为'@'的node都变成'*'。)
然后deposits++
最后输出deposits。
话说我AC了哟。
View Code
1 #include <iostream> 2 using namespace std; 3 4 int min(int x, int y){ 5 return (x < y)? x : y; 6 } 7 8 int max(int x, int y){ 9 return (x > y)? x : y; 10 } 11 12 bool isolated(char grid[][100], int x, int y, int m, int n){ 13 for (int i = max(x-1, 0); i <= min(x+1, m-1); i++){ 14 for (int j = max(y-1, 0); j <= min(y+1, n-1); j++){ 15 if (!(i == x && j == y) && grid[i][j] == '@') 16 return false; 17 } 18 } 19 return true; 20 } 21 22 void dfs(char grid[][100], int x, int y, int m, int n){ 23 grid[x][y] = '*'; 24 if (isolated(grid, x, y, m, n)){ 25 return; 26 } 27 28 for (int i = max(x-1, 0); i <= min(x+1, m-1) ; i++){ 29 for (int j = max(y-1, 0); j <= min(y+1, n-1); j++){ 30 if (!(i == x && j == y) && grid[i][j] == '@') 31 dfs(grid, i, j, m, n); 32 } 33 } 34 } 35 36 int main(int argc, char *argv[]){ 37 char grid[100][100]; 38 int m, n; 39 cin >> m >> n; 40 41 while (m != 0){ 42 for (int i = 0; i < 100; i++){ 43 for (int j = 0; j < 100; j++){ 44 grid[i][j] = ' '; 45 } 46 } 47 for (int i = 0; i < m; i++){ 48 cin >> grid[i]; 49 } 50 51 int deposits = 0; 52 for (int i = 0; i < m; i++){ 53 for (int j = 0; j < n ; j++){ 54 if (grid[i][j] == '@'){ 55 deposits++; 56 dfs(grid, i, j, m, n); 57 } 58 } 59 } 60 61 cout << deposits << endl; 62 cin >> m >> n; 63 } 64 return 0; 65 }
这里的东西都是自娱自乐的.我只是抱着构思算法的心态去做UVA的题.
我所有的code都不可能AC的.因为我就没想着让它能AC.


浙公网安备 33010602011771号