hdu 1241Oil Deposits(dfs模板)
题目链接——
http://acm.hdu.edu.cn/showproblem.php?pid=1241
首先给出一个n*m的字符矩阵,‘*’表示空地,‘@’表示油井。问在这个矩阵中有多少组油井区?
每个点周围的8个点都可以与之相连。
从左上角的点开始向后枚举然后dfs搜索就可以了。记得记忆化。
废话说完,上代码——
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 210; 8 const int M = 8; 9 10 int dis[M][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; //判断8个方向 11 char mp[N][N]; //原图 12 int n, m; //矩阵大小 13 int ans; //结果 14 15 void dfs(int x, int y) //dfs搜索函数 16 { 17 mp[x][y] = '*'; //当前点初处理后需要将它消掉,免得重复处理,即“记忆化” 18 for(int i = 0; i < M; i++) 19 { 20 int mx = x+dis[i][0]; 21 int my = y+dis[i][1]; 22 if(mx >= 0 && mx < n && my >= 0 && my < m && mp[mx][my] == '@') dfs(mx, my); 23 } 24 } 25 26 void Work() //主处理函数 27 { 28 for(int i = 0; i < n; i++) 29 { 30 for(int j = 0; j < m; j++) 31 { 32 if(mp[i][j] == '@') 33 { 34 ans++; 35 dfs(i, j); 36 } 37 } 38 } 39 } 40 41 void Init() //初始化函数 42 { 43 getchar(); 44 for(int i = 0; i < n; i++) scanf("%s", mp[i]); 45 ans = 0; 46 } 47 48 void Outit() //输出函数 49 { 50 printf("%d\n", ans); 51 } 52 53 int main() 54 { 55 //freopen("test.in", "r", stdin); 56 while(~scanf("%d%d", &n, &m) && m) 57 { 58 Init(); 59 Work(); 60 Outit(); 61 } 62 return 0; 63 }