深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
2016-03-10 11:26
405 查看
DFS入门的一道经典题目:LakeCounting
用栈或队列来实现:
用栈来实现深度优先搜索。
大概的思路我用伪代码来解释:
2016/3/10
用栈或队列来实现:
#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]; //核心部分DFS void 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
相关文章推荐
- 多个USB短信猫,启动短信猫后台程序总是有几个不能连接
- 3727: PA2014 Final Zadanie|树形DP
- 关于Bootstrap弹出框无法调用问题的解决办法
- 卓有成效的开发者
- 开发错误记录3 Error:failed to find Build Tools revision 23.0.2 rc2
- Android开源库之沉浸式通知栏的简单实现(SystemBarTintManager)
- 第1次上机实验
- 使用IntelliJ IDEA 14和Maven创建java web项目
- SNMP配置方法
- Jquery定义对象( 闭包 )
- APPIUM+JAVA实现对安卓APK的自动化测试----第十一篇【定位元素】
- HTTP协议具体解释
- rtc关机闹钟7 jni层 com_android_server_AlarmManagerService
- 详细解析: VictorOps 是如何利用和完善 ChatOps?
- user agent stylesheet 处理
- 菜鸟学习DirctX12(2)--基础及初始化
- ActiveMQ快速上手
- Autotools 编译工程
- <LeetCode OJ> 78. Subsets
- 第1次上机实验-1