博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 572 Oil Deposits (DFS)
阅读量:5364 次
发布时间:2019-06-15

本文共 1372 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

  给你一个M 行N 列的矩阵,其中仅有两种符号,“@” 和 “×”,问你有多少个连通块, 所谓连通就是一个“@” 的上下左右以及对角线有另外一个“@”,则说明者两个“@”连通的。

****@
*@@*@
*@**@
@@@*@
@@**@

比如此矩阵中仅有2个连通块。

思路:

   从第一个“@”开始DFS ,找到与它连通的并标记为同一数字,直到所有连通的都标记完,再从下一个没被标记的“@”处DFS,并标记为另外一个数字,最后查看有多少个数字就可以了。

代码:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 9 typedef long long LL;10 using namespace std;11 const double PI = acos(-1);12 const int MAXN = 100;13 int idx[MAXN + 3][MAXN + 3];14 char map[MAXN + 3][MAXN + 3];15 16 void dfs(int x, int y, int cnt){17 idx[x][y] = cnt;//都标记为同一数字18 for(int i = -1; i <= 1; i++){ //两层循环排查周围的点19 for(int j = -1; j <= 1; j++){20 if(x + i >= 0 && y + j >= 0 && idx[x + i][y + j] == 0 && map[x + i][y + j] == '@')//排除掉不满足情况的点21 dfs(x + i, y + j, cnt);22 }23 }24 }25 26 int main(){27 //freopen("input", "r", stdin);28 int n, m;29 while(scanf("%d%d", &n, &m) && (n != 0)){30 memset(map, 0, sizeof(map));31 memset(idx, 0, sizeof(idx));32 for(int i = 0; i < n; i++) scanf("%s", map[i]);33 int cnt = 0;34 for(int i = 0; i < n; i++){35 for(int j = 0; j < m; j++){36 if(!idx[i][j] && map[i][j] == '@'){ //每次都从没被标记且时“@”处开始新的DFS 37 dfs(i, j, ++cnt);38 }39 }40 }41 printf("%d\n", cnt);42 }43 return 0;44 }

 

转载于:https://www.cnblogs.com/Ash-ly/p/5701174.html

你可能感兴趣的文章
把特斯拉送上火星的程序员,马斯克!
查看>>
三测单
查看>>
MyBatis 缓存
查看>>
SQL中left outer join与inner join 混用时,SQL Server自动优化执行计划
查看>>
mac下python实现vmstat
查看>>
jxl.dll操作总结
查看>>
成员函数对象类的const和非const成员函数的重载
查看>>
机器学习实战-----八大分类器识别树叶带源码
查看>>
eclipse git 新的文件没有add index选项
查看>>
java 泛型
查看>>
VC NetShareAdd的用法
查看>>
java web项目中后台控制层对参数进行自定义验证 类 Pattern
查看>>
图论学习一之basic
查看>>
Java的Array和ArrayList
查看>>
记录Ubuntu 16.04 安装Docker CE
查看>>
安东尼奥·维瓦尔第——巴洛克音乐的奇葩
查看>>
pandas的增删改查
查看>>
HDU 5933/思维
查看>>
字节对齐
查看>>
Design Tic-Tac Toe
查看>>