Uva - 572 - Oil Deposits
2015-06-16 12:53
211 查看
图的连通块问题,,DFS深度优先遍历递归找出每个连通块,并标记,注意边界情况的处理。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <sstream> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <bitset> #include <cassert> using namespace std; const int maxn = 105; int m, n; char pic[maxn][maxn]; int idx[maxn][maxn]; void dfs(int r, int c, int id) { if (r < 0 || r >= m || c < 0 || c >= n) { // 非法位置 return; } if (idx[r][c] > 0 || pic[r][c] != '@') { // 已经标记过或者不是油田 return; } idx[r][c] = id; // 一块油田编号 for (int dr = -1; dr <= 1; dr++) { for (int dc = -1; dc <= 1; dc++) { // 用两个循环遍历周围的八个油田 if (dr != 0 || dc != 0) { // dr == 0 和dc == 0是中间自身,跳过不执行 dfs(r + dr, c + dc, id); } } } } int main() { while (scanf("%d%d", &m, &n) == 2 && m && n) { for (int i = 0; i < m; i++) { scanf("%s", pic[i]); } memset(idx, 0, sizeof(idx)); int cnt = 0; // 油田块的个数 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (idx[i][j] == 0 && pic[i][j] == '@') { // 是油田,并且没有并编号过 dfs(i, j, ++cnt); } } } cout << cnt << endl; } return 0; }
相关文章推荐
- python学习笔记(二)
- Uva - 572 - Oil Deposits
- Linux共享内存使用常见陷阱与分析
- C++ mkdir() 头文件
- 深入分析 Java 中的中文编码问题
- Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)
- LAMP环境下搭建discuz!论坛
- 如何在 Apache 中抵御暴力破解和 DDoS 攻击
- 北京c++技术交流 235760268
- opencv cvHoughCircles() 霍夫圆变换
- Python学习(三)---常见类型转换、数值操作、序列操作
- AVCaptureDevice iOS摄像头属性
- Android训练课程(Android Training) - 测试你的Android Activity
- OJ 继承与组合
- 一个宏命令,就可以程序崩溃时生成dump文件
- 有关网页渲染,每个前端开发者都该知道的那点事
- Ajax个人理解2
- phonegap(cordova)文件上传(Java,PHP)
- 一个简单易懂的javascrip selection&range小案例
- SAT数学:考试允许使用计算器