#1241: Oil Deposits(八向搜索 + 并查集)
Oil Deposits
It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large
and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.
and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket.
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
1
2
2
本题是指@表示油点,*表示非油点,油点相邻则表示一个油点而不是多个,找出总油点个数。没啥技巧,就是八个方向搜索,同时利用并查集的效率更高
DFS搜索:
#include<bits/stdc++.h>
using namespace std;
const int N = 100 + 5;
char g[N][N];
bool book[N][N];
int n, m;
const int dx[] = { 0,0,1,1,1,-1,-1,-1 };
const int dy[] = { 1,-1,0,1,-1,0,1,-1 };
void dfs(int i, int j) {
book[i][j] = 1;
for (int k = 0; k < 8; k++){
int nx = i + dx[k], ny = j + dy[k];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && book[nx][ny] == 0 && g[nx][ny] == '@')dfs(nx, ny);
}
}
int main() {
//freopen("in.txt", "r", stdin);
while (cin >> m >> n && n && m) {
memset(g, 0, sizeof(g));
memset(book, 0, sizeof(book));
for (int i = 0; i < m; i++)cin >> g[i]; int cnt = 0;
for (int i = 0; i < m; ++i)for (int j = 0; j < n; ++j)if (g[i][j] == '@' && !book[i][j]) { cnt++; dfs(i, j); }
cout << cnt << endl;
}
return 0;
}
并查集:
#include<bits/stdc++.h>
using namespace std;
char g[101][101];
int fa[101 * 101];
int x[] = { 0,0,1,-1,1,-1,1,-1 };
int y[] = { 1,-1,0,0,1,1,-1,-1 };
int n, m;
int id(int x, int y) {
return (x - 1)*m + y;
}
bool isok(int x, int y) {
if (0 < x&&x <= n && 0 < y&&y <= m)
return true;
return false;
}
int Find(int x) {
return fa[x] == x ? x : fa[x] = Find(fa[x]);
}
int vis[101 * 101];
int main() {
while (scanf("%d%d", &n, &m) != EOF && n + m) {
memset(vis, 0, sizeof vis);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
fa[id(i, j)] = id(i, j);
}
}
for (int i = 1; i <= n; ++i)
scanf("%s", g[i] + 1);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (g[i][j] == '*') continue;
for (int k = 0; k < 7; ++k) {
int xx = i + x[k], yy = j + y[k];
if (isok(xx, yy) == false || g[xx][yy] == '*') continue;
int f1 = Find(id(i, j)), f2 = Find(id(xx, yy));
if (f1 != f2) {
fa[f1] = f2;
}
}
}
}
int cnt = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (g[i][j] != '*'&&vis[Find(id(i, j))] == 0) {
cnt++;
vis[Find(id(i, j))] = 1;
}
}
}
cout << cnt << endl;
}
return 0;
}
#1241: Oil Deposits(八向搜索 + 并查集)的更多相关文章
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu 1241 Oil Deposits (简单搜索)
题目: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...
- HDOJ(HDU).1241 Oil Deposits(DFS)
HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...
- hdu 1241 Oil Deposits(DFS求连通块)
HDU 1241 Oil Deposits L -DFS Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & ...
- HDU 1241 Oil Deposits --- 入门DFS
HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...
- HDU 1241 Oil Deposits(石油储藏)
HDU 1241 Oil Deposits(石油储藏) 00 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Probl ...
- DFS(连通块) HDU 1241 Oil Deposits
题目传送门 /* DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 */ /************************************************ ...
- hdoj 1241 Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 1241 Oil Deposits (DFS)
题目链接:Oil Deposits 解析:问有多少个"@"块.当中每一个块内的各个"@"至少通过八个方向之中的一个相邻. 直接从"@"的地方 ...
- HDU 1241 Oil Deposits【DFS】
解题思路:第一道DFS的题目--- 参看了紫书和网上的题解-- 在找到一块油田@的时候,往它的八个方向找,直到在能找到的范围内没有油田结束这次搜索 可以模拟一次DFS,比如说样例 在i=0,j=1时, ...
随机推荐
- Leetcode旋转图像
上C语言代码,矩阵先转置再左右对称就是旋转图像的答案啦 void rotate(int** matrix, int matrixSize, int* matrixColSize){ int i,j,n ...
- C语言判断输入的正整数是否既是5又是7的整倍数。
#include<stdio.h> void main() { int n;//定义变量 while (1) { scanf_s("%d", &n); if ( ...
- phpmyadmin修改上传限制,phpmyadmin修改上传文件大小限制,docker版本phpmyadmin
我用的是DOCKER 版本的phpmyadmin 修改/usr/local/etc/php/conf.d/phpmyadmin-misc.ini 内的限制变量文件为 100M,重启docker 容器后 ...
- 校园社团活动管理系统(适合小白)基础javaweb前端项目实战【包含增删改查,mysql】一
校园社团活动管理系统(20分) 1.项目需求: 校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团规模.数量等都在日益增长,社团活动也更为多样和丰富.然而,大多数高校 ...
- 【Javaweb】Servlet九 | base标签的作用【详细介绍】 Web路径相关知识
base标签的作用 导言:路径跳转 <a href="/a/b/c.html">这是a下的b下的c</a></br> <a href=&q ...
- 企业数据分析免费试用的BI工具,有什么推荐?
当涉及到企业数据分析的免费试用BI工具时,有几个受欢迎且功能强大的选项可供选择.以下是对每个工具的详细介绍,帮助您了解其特点和优势. Datainside BI(https://datainside. ...
- uni-app全局样式和局部样式
前言 好,经过上个章节的介绍完毕之后,了解了一下 UniApp 的一个全局 页面配置文件,也就是我们的一个 pages.json 文件. 那么了解完了这个文件之后,这片文章,再了解一下 UniApp ...
- 一款开源免费美观的WinForm UI控件库 - ReaLTaiizor
前言 今天推荐一款基于MIT license开源.免费.美观的.NET WinForm UI控件库:ReaLTaiizor. 什么是WinForm? WinForm是一个传统的桌面应用程序框架,它基于 ...
- MinIO客户端之ls
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc ls 列出本地硬盘上的文件,命令如下: ./mc ls 控制台的输出,如下: [2023-12-14 23: ...
- 2023-11-15:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那么称这个正方形矩阵叫做神奇矩阵, 比如 : 1 5 5 1 6 3 3 6 6 3 3 6 1 5
2023-11-15:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那么称这个正方形矩阵叫做神奇矩阵, 比如 : 1 5 5 1 6 3 3 6 6 3 3 6 1 5 ...