深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
来源:互联网 发布:php 下载为电子文档 编辑:程序博客网 时间:2024/05/17 04:24
DFS入门的一道经典题目:LakeCounting
用栈或队列来实现:
#include<cstdio>#include<stdlib.h>#include<iostream>#include<stack>using namespace std;int n,m;int pla[10][3]={{1,0},{1,1},{1,-1},{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}};//对坐标进行移动的向量struct place{ int x,y;};//用结构体表示坐标char a[105][105];//核心部分DFSvoid DFS(int i,int j){ place begin,between; stack<place>s;//stack的类型是坐标place begin.x=i; begin.y=j;//从(i,j)开始搜索 s.push(begin);//存入s while(!s.empty())//为空搜索结束 { begin=s.top();//提出栈顶进行搜索 s.pop(); for(i=0;i<8;i++) { between.x=begin.x+pla[i][0]; between.y=begin.y+pla[i][1];//加上坐标 if(between.x>=0 && between.x<=n && between.y>=0 && between.y<=m && a[between.x][between.y]=='W')//在草地的范围内且是水 { s.push(between);//入栈 a[between.x][between.y]='.';//改成‘.’防止重复判断 } } } }int main(){ int i,j,k,t=0,sum=0; scanf("%d%d",&n,&m); getchar(); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%c",&a[i][j]); } getchar(); } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i][j]=='W') { DFS(i,j); sum++;//调用几次DFS即是水潭的个数 } } } printf("%d\n",sum); return 0;}
用栈来实现深度优先搜索。
大概的思路我用伪代码来解释:
伪代码:void DFS(传入刚开始坐标){ stack<坐标>s; 坐标begin,between. begin存刚刚开始的坐标; begin入栈; while(s不为空)//s为空时停止搜索 { 坐标begin=栈顶坐标; 栈顶坐标出栈,开始搜索。 for(遍历八个搜索向量) { begin+搜索向量; if(此时搜索到了水坑) { begin+搜索向量入栈(即此时搜索到的坐标); 被搜索到的这个坐标标记为土地; } } }}
2016/3/10
0 0
- 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
- ACM-POJ 1562 DFS 深度优先搜索
- ACM-POJ 1979 DFS 深度优先搜索
- 深度优先搜索dfs(poj 1655)
- POJ-1979 深度优先搜索DFS
- 深度搜索DFS-Lake Counting(POJ NO.2386)
- 深度搜索DFS-Lake Counting(POJ NO.2386)
- 深度优先搜索 DFS
- 深度优先搜索 DFS
- DFS 深度优先搜索
- DFS 深度优先搜索
- 深度优先搜索(DFS)
- 深度优先搜索(DFS)
- 深度优先搜索DFS
- DFS深度优先搜索
- 深度优先搜索(DFS)
- dfs深度优先搜索
- dfs 深度优先搜索
- 高精度N的阶乘-N!
- 《算法竞赛入门经典》习题及反思
- hdoj-2053-Switch Game
- JS HashMap
- Oracle PLSQL通过SMTP发送E-MAIL邮件代码
- 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
- 使用fio测试磁盘I/O性能
- hdoj-2098-分拆素数和
- Redis和Memcache对比及选择
- 3GPP规范命名规则解读
- 深度优先搜索之小z的房子与验证码识别
- hdoj-2089-不要62
- 在C中使用LuaJit FFI
- CentOS 使用httpd 配置局域网 yum源