技巧:遍历8个方向

  1. for(int dr = -1; dr <= 1; dr++)
  2. for(int dc = -1; dc <= 1; dc++)
  3. if(dr != 0 || dc != 0) dfs(r+dr, c+dc, id);

我的解法:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<string>
  5. #include<algorithm>
  6. using namespace std;
  7. const int N=102;
  8. char buf[N][N];
  9. int m, n;
  10. int cnt;
  11. int dr[]={0, 0, 1, 1, 1, -1, -1, -1};
  12. int dc[]={1, -1, -1, 0, 1, -1, 0, 1};
  13.  
  14. void dfs(int r, int c)
  15. {
  16. buf[r][c]='*';
  17. for(int i=0;i<8;i++)
  18. {
  19. if(buf[r+dr[i]][c+dc[i]]=='@')
  20. dfs(r+dr[i], c+dc[i]);
  21. }
  22.  
  23. }
  24.  
  25. int main()
  26. {
  27. #ifndef ONLINE_JUDGE
  28. freopen("./uva572.in", "r", stdin);
  29. #endif
  30. while(cin>>m>>n && m)
  31. {
  32. memset(buf, '*', sizeof buf);
  33. cnt=0;
  34. for(int i=1;i<=m;i++)
  35. {
  36. cin>>(buf[i]+1);
  37. }
  38.  
  39. for(int i=1;i<=m;i++)
  40. {
  41. for(int j=1;j<=n;j++)
  42. {
  43. if(buf[i][j]=='@')
  44. {
  45. dfs(i, j);
  46. cnt++;
  47. }
  48. }
  49. }
  50. cout<<cnt<<endl;
  51. }
  52.  
  53. return 0;
  54. }

 

lrj的解法在统计的时候把连通块的序号也求出来了,保存在idx中。

  1. // UVa572 Oil Deposits
  2. // Rujia Liu
  3. // 题意:输入一个字符矩阵,统计字符@组成多少个四连块
  4. #include<cstdio>
  5. #include<cstring>
  6. const int maxn = 100 + 5;
  7.  
  8. char pic[maxn][maxn];
  9. int m, n, idx[maxn][maxn];
  10.  
  11. void dfs(int r, int c, int id) {
  12. if(r < 0 || r >= m || c < 0 || c >= n) return;
  13. if(idx[r][c] > 0 || pic[r][c] != '@') return;
  14. idx[r][c] = id;
  15. for(int dr = -1; dr <= 1; dr++)
  16. for(int dc = -1; dc <= 1; dc++)
  17. if(dr != 0 || dc != 0) dfs(r+dr, c+dc, id);
  18. }
  19.  
  20. int main() {
  21. while(scanf("%d%d", &m, &n) == 2 && m && n) {
  22. for(int i = 0; i < m; i++) scanf("%s", pic[i]);
  23. memset(idx, 0, sizeof(idx));
  24. int cnt = 0;
  25. for(int i = 0; i < m; i++)
  26. for(int j = 0; j < n; j++)
  27. if(idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt);
  28. printf("%d\n", cnt);
  29. }
  30. return 0;
  31. }

UVa572 Oil Deposits DFS求连通块的更多相关文章

  1. HDU1241 Oil Deposits —— DFS求连通块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...

  2. [C++]油田(Oil Deposits)-用DFS求连通块

    [本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...

  3. UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

    UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...

  4. UVA 572 Oil Deposits油田(DFS求连通块)

    UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format: ...

  5. DFS入门之二---DFS求连通块

    用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...

  6. UVA 572 dfs求连通块

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  7. 用DFS求连通块(种子填充)

    [问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...

  8. hdu 1241 Oil Deposits(DFS求连通块)

    HDU 1241  Oil Deposits L -DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & ...

  9. DFS:POJ1562-Oil Deposits(求连通块个数)

    Oil Deposits Time Limit: 1000MS Memory Limit: 10000K Description The GeoSurvComp geologic survey com ...

随机推荐

  1. 流媒体相关知识介绍 及其 RTP 应用

    一.流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡.目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒 ...

  2. hdu 1211 RSA

    // 表示题目意思我是理解了蛮久 英语太水了 //首先这是解密公式 m=c^d mod n// 给你 p q e 然后 n=p*q fn=(p-1)*(q-1)// 给你 e,根据公式 e*d mod ...

  3. 3732 Ahui Writes Word

    // N个物品 放进容量为C的背包里面 要求价值最大// 一看 第一反应是0 1背包 不过 N=100000 C=10000// 注意到 v,c在 10以内// 那么 最多就100种组合了 然后就转化 ...

  4. 通过userAgent判断手机浏览器类型

    我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...

  5. Linux User's Manual IOSTAT

    IOSTAT(1) Linux User's Manual IOSTAT(1) NAME iostat - Report Central Processing Unit (CPU) statistic ...

  6. java web 学习十二(session)

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  7. Extjs Ext.onReady的用法

    最近在学习Extjs,当然首先学习的肯定是从官网下载下来的example. 从学习上而言对于Extjs,我个人认同的是李林峰老师所言先从视图开始,搞一些所见即所得的东西. 废话有点多,对于Extjs而 ...

  8. android studio 中获取sha1

    使用keytool 一.配置环境变量 由于要用到keytool工具,而keytool是jdk里的一个工具,首先将jdk/bin所在的目录加到环境变量的PATH中 看我的keytool所在位置 将所在路 ...

  9. C/C++:类模板

    类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的声明形式如下: template ...

  10. Codeforces 372

    A (被装的袋鼠不可以装的袋鼠)贪心,排序,从n/2分成两部分. B 好一道前缀和的题目. C 标准算法不难想,m^2的算法见http://codeforces.com/blog/entry/9907 ...