HDOJ 1241 Oil Deposits【最大连通块 dfs】
2015-08-02 19:58
363 查看
HDOJ 1241 Oil Deposits【最大连通块 dfs】
输入那里很烦。。。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXL = 105; // 矩阵最大宽度 char maze[MAXL][MAXL]; // 迷宫 int vis[MAXL][MAXL]; // 访问标记(坐标点所在连通块编号) int n, m; // 迷宫的长和宽 int dirx[8] = {0, 1, 0, -1, 1, 1, -1, -1}; int diry[8] = {1, 0, -1, 0, 1, -1, -1, 1}; // 移动方向 typedef struct point{ int x, y; }P; // 坐标 void Output(){ for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ printf("%c", maze[i][j]); } printf("\n"); } } void Input(){ memset(maze, 0, sizeof(maze)); memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++){ scanf("%s", &maze[i]); } //Output(); } void dfs(int x, int y, int cnt){ if(x < 0 || x >= n || y < 0 || y >= m) return; // 越界 返回 if(maze[x][y] == '*' || vis[x][y] != 0) return; // 没有油或已经访问过 返回 vis[x][y] = cnt; for(int i = 0; i < 8; i++){ dfs(x+dirx[i], y+diry[i], cnt); // 遍历邻接点 } } int Sum(){ int cnt = 0; // 连通块的数量 for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(maze[i][j] == '@' && vis[i][j] == 0){ // 有油并且没有标记过 dfs(i, j, ++cnt); } } } return cnt; } int main(){ while(~scanf("%d%d", &n, &m) && n && m){ Input(); printf("%d\n", Sum()); } return 0; }
相关文章推荐
- 精灵进程的创建
- C#委托(Delegate)学习日记
- PCA + SVM 人脸识别
- hdu 5340 Three Palindromes
- 有向图的欧拉回路及欧拉道路
- java中的I/O流
- Nutch2.2.1 开发环境搭建
- javascript设计模式之Mediator(中介者)模式
- WRL 类库项目模板
- BFS POJ 3126 Prime Path
- SSH学习九 依赖注入及加载Spring配置文件的方法
- 20150802-泛型
- 【转】CAD2012打开自动关闭解决方法
- How to write a good tech blog
- C语言-递归算法以及经典递归(Hanoi)
- 字符串拷贝操作
- Save the Trees
- poj 3662 二分+最短路
- 输入一行字符串,找出其中的相同且长度最长的字符串
- java中怎样在界面中显示图片?