HDOJ1241 Oil Deposits(DFS,八连通块)
来源:互联网 发布:淘宝整点秒杀在哪 编辑:程序博客网 时间:2024/06/01 07:28
HDOJ 1241
实际上是求连通块的题目。
第二次看这道题目,看第一次写这道题目,或多或少写的麻烦了一点,visit数组标记有没有访问过不如,将访问过的@直接替换成”.”就好。
第二次AC:
#include<iostream>#include<string.h>using namespace std;#define maxn 1010int n,m;char mp[maxn][maxn];void dfs(int x,int y){ mp[x][y]='*'; int dx,dy; for(dx=-1;dx<=1;dx++){ for(dy=-1;dy<=1;dy++){ int nx=x+dx,ny=y+dy; if(0<=nx&&nx<n&&0<=ny&&ny<m&&mp[nx][ny]=='@'){ dfs(nx,ny); } } }}int main(){ while(cin>>n>>m&&n){ int i,j; for(i=0;i<n;i++){ scanf("%s",mp[i]); } int cnt=0; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(mp[i][j]=='@'){ dfs(i,j); cnt++; } } } cout<<cnt<<endl; } return 0;}
————————————————————————————————————————————————————
DFS的搜索由原来的四个方向变为八个方向。和之前选数字或者给定出口和入口的题目不一样,本题需要全部遍历地图,当一个格子是@时,cnt++,并且搜索和它八个方向联通的所有格子,标记已经访问。visit[][]=1.如此访问结束
给出地图规模n * m,地图中 *(星号)代表空白, @ 代表油田。一群@联通在一起称为油田块(此处的联通为八方向联通)。求地图中油田块的个数。
分析:
既然是求解油田块的个数,自然先想到的办法就是先处理一个油田块,然后处理下一个油田块……然后依次计数油田块的个数,也就是每次处理一个油田块的时候+1。我们按照这种方法来实现。
与之前的选数字,或者是给出指定入口求解是否能走地图的题目不同。本题需要全部遍历地图,也就是说需要一个一个格子来遍历地图,采用双重的for循环来实现。试想一下:当某一个格子是@时候,我们就从这个格子开始进行dfs,dfs的目的是处理掉与@相连的所有的@,于此同时计数+1。处理完成后,找到下一个是@的格子,再处理掉与此相连的@,计数+1。如此往复,直到处理完整个地图,搜索结束。
那么不难看出,递归边界就是:这个格子在地图外边。进行递归的条件是:当且仅当这个格子是@并且还没有访问过。
还有一点别忘记,此题判定@@相邻的条件是八向联通 也就是左上左下右上右下相邻也算联通,所以此题是八向搜素。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n, m,visit[105][105],cnt;char mp[105][105];int spx[] = {0,1,0,-1,1,1,-1,-1};int spy[] = {1,0,-1,0,-1,1,1,-1};bool check(int x, int y){ if(x<0 || x>=n || y<0 || y>=m) return false; else return true;}void dfs(int x , int y){ if(!check(x,y)) return;//发生越界的时候,终止递归 visit[x][y] = 1; for(int i = 0;i <8 ;++i){ int nx = x+ spx[i]; int ny = y +spy[i]; if(visit[nx][ny] == 0 && mp[nx][ny] =='@')//当且仅当格子是@并且没有访问过 dfs(nx,ny); }}int main(){ while(scanf("%d%d",&n,&m) && n){ for(int i = 0; i<n;++i) scanf("%s",mp[i]); cnt = 0; memset(visit,0,sizeof(visit)); for( i = 0;i <n; ++i){//采用双重for循环遍历整个地图 for(int j =0; j<m; ++j){ if(!visit[i][j]&&mp[i][j] == '@'){//当且仅当格子是@并且没有访问过 cnt++; dfs(i,j); } } } printf("%d\n",cnt); } return 0;}
- HDOJ1241 Oil Deposits(DFS,八连通块)
- POJ 1562 Oil Deposits(DFS,八连通,连通分量)
- UVA572 POJ1562 oil deposits(DFS求连通块问题)
- DFS:POJ1562-Oil Deposits(求连通块个数)
- Uva 572 Oil Deposits 油田 (DFS求连通块)
- HDOJ1241 Oil Deposits(DFS模板题)
- UVa 572 Oil Deposits(DFS求8连通块)
- HDOJ 1241 Oil Deposits【最大连通块 dfs】
- UVA 572 Oil Deposits dfs求连通块
- UVa - 572 - Oil Deposits(dfs求连通块)
- Uva572 Oil Deposits 【dfs求连通块】【例题6-12】
- HDU 1241 Oil Deposits DFS求连通块
- HDU1241 Oil Deposits —— DFS求连通块
- hdoj1241 Oil Deposits
- HDOJ1241 Oil Deposits
- hdoj1241 Oil Deposits
- Oil Deposits<hdoj1241>
- POJ 1562 Oil Deposits(DFS:求八连通分量个数)
- Unity手游制作记-制作通用对象管理器(三)
- dubbo 异常Please check registry access list (whitelist/blacklist)
- MAC下phpstrom使用xdebug调试
- 2017.8.10~11总结
- 用流统计单词
- HDOJ1241 Oil Deposits(DFS,八连通块)
- 设计模式--模版模式
- 链表倒数第n个节点
- JZOJ5257. 小X的佛光(2017.8B组)
- Android应用程序消息处理机制(Looper、Handler)分析
- 每日MySQL之018:使用SET设置用户变量和系统变量
- 1009. 说反话 (20)
- yui初始化cssreset.css
- Sqlserver 数据库文件大小和剩余空间