HDU 1241 Oil Deposits(油藏)
2015-12-26 20:27
411 查看
题目链接:HDU 1241
题意:
给一个二维字符数组,‘@’代表有油,‘*’代表没有,如果两个油田在水平或竖直或对角线方向相通,那么这两个油田属于同一个pocket,pocket里可能也只有一个油田。问给定的油藏情况共有多少个pocket?
分析:
两天前做的时候还没有头绪,今天拿出来又想了一下,突然有了思路。
同样是BFS搜索。但是每次搜索是从一个尚未被访问的油田开始,然后把从这个油田开始可以连通的所有油田都标记上,也就是搜索这一个pocket里的所有油田。那么在下一次搜索时一定是另一个pocket了。这样一来,有多少次BFS就有多少个pocket了。想通了这一点就很简单了。
注意点:
搜索方向有八个,不是4个,也不是6个。
标记一定要进队列之前标记,而不是出队列时标记,否则会Memory Limit Exceeded.
CODE:
题意:
给一个二维字符数组,‘@’代表有油,‘*’代表没有,如果两个油田在水平或竖直或对角线方向相通,那么这两个油田属于同一个pocket,pocket里可能也只有一个油田。问给定的油藏情况共有多少个pocket?
分析:
两天前做的时候还没有头绪,今天拿出来又想了一下,突然有了思路。
同样是BFS搜索。但是每次搜索是从一个尚未被访问的油田开始,然后把从这个油田开始可以连通的所有油田都标记上,也就是搜索这一个pocket里的所有油田。那么在下一次搜索时一定是另一个pocket了。这样一来,有多少次BFS就有多少个pocket了。想通了这一点就很简单了。
注意点:
搜索方向有八个,不是4个,也不是6个。
标记一定要进队列之前标记,而不是出队列时标记,否则会Memory Limit Exceeded.
CODE:
#include <iostream> #include <string> #include <cstring> #include <queue> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 110; int dir[8][2] = { { 0,1 },{ 0,-1 },{ 1,0 },{ -1,0 } ,{-1,-1},{1,1} ,{-1,1},{1,-1} }; int a[maxn][maxn], vis[maxn][maxn], ans, m, n; char s[maxn]; int valid(int x, int y) { if (x < 0 || y < 0 || x >= m || y >= n || vis[x][y] || a[x][y]==0) return 0; return 1; } struct Node { int x, y; }cur, nextnode; void bfs(int w, int r) { ans++; queue<Node> q; cur.x = w; cur.y = r; vis[cur.x][cur.y] = 1; q.push(cur); while (!q.empty()) { cur = q.front(); q.pop(); for (int i = 0;i < 8;i++) { nextnode.x = cur.x + dir[i][0]; nextnode.y = cur.y + dir[i][1]; if (!valid(nextnode.x,nextnode.y)) continue; vis[nextnode.x][nextnode.y] = 1; q.push(nextnode); } } return; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif while (cin >> m >> n) { if (m == 0) break; for (int i = 0;i < m;i++) { cin >> s; for (int j = 0;j < n;j++) a[i][j] =( s[j] == '*') ? 0 : 1; } memset(vis, 0, sizeof(vis)); ans = 0; for (int i = 0;i < m;i++) for (int j = 0;j < n;j++) { if (a[i][j] && !vis[i][j]) bfs(i, j); } cout << ans << endl; } return 0; }
相关文章推荐
- Calendar 自定义日历控件
- zookeeper集群搭建
- 搭建一个简单的Struts2框架
- webService是什么
- 【LVL1_5_c】【课后练习】【7】自己造一个strlen()函数,求字符串的长度
- mysqlbinlog解析的几篇经典文章
- 算法设计题2.30-线性表-第2章-《数据结构习题集》-严蔚敏吴伟民版
- Python 网络编程 Socket
- leetcode-Second Highest Salary
- 一段代码完成所有分享功能,分分钟搞定分享功能
- 网络流24题 之十四 孤岛营救问题 分层图
- Java系列: 我的第一个spring aop练习
- Shell编程入门(第二版)(中)
- 【我与云表的故事】我用云表做工作日历
- java web基础 --- URL重定向Filter
- 图的m着色问题(回溯法-满m叉树)
- DataTable某个字段倒序显示
- 【Android学习笔记】This tag and its children can be replaced by one <TextView/> and a compound drawable
- 高精度减法
- 进制转换