hdu 1241 Oil Deposits 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
这是我的第一条深搜题,参考了一个非常有耐心指导我的师兄的代码才写出来的(算是模板吧),觉得dfs好神奇。
在我看来,使用dfs主要包括几点:1、建图(map,通常是二维数组) 2、标记(visited,对已经访问过的点标记,防止再搜) 3、对边界条件和不符合条件的判断。满足才dfs,不满足return。引用那位很好人的师兄的话,深搜基本就是暴力。
1 #include <iostream> 2 using namespace std; 3 4 char map[105][105]; 5 int i, j, m, n; //全局变量,以便在dfs()和main()里可见 6 7 void dfs(int i, int j) 8 { 9 if (map[i][j] != '@' || i < 0 || j < 0 || i >= m || j >= n) 10 return; 11 else 12 { 13 map[i][j] = '*'; //这题的标记是直接在map里操作 14 dfs(i-1, j-1); //向8个方向里搜 15 dfs(i-1, j); 16 dfs(i-1, j+1); 17 dfs(i, j-1); 18 dfs(i, j+1); 19 dfs(i+1, j-1); 20 dfs(i+1, j); 21 dfs(i+1, j+1); 22 } 23 } 24 25 int main() 26 { 27 int total; 28 while (cin >> m >> n && (m || n)) 29 { 30 total = 0; 31 for (i = 0; i < m; i++) 32 { 33 for (j = 0; j < n; j++) 34 cin >> map[i][j]; 35 } 36 for (i = 0; i < m; i++) 37 { 38 for (j = 0; j < n; j++) 39 { 40 if (map[i][j] == '@') 41 { 42 dfs(i, j); 43 total++; //直到不能再找到一大片油田才加1 44 } 45 } 46 } 47 cout << total << endl; 48 } 49 return 0; 50 }