深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
2016-03-19 14:00
417 查看
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
相关文章推荐
- hdoj-2053-Switch Game
- 《算法竞赛入门经典》习题及反思
- 高精度N的阶乘-N!
- 列举一些有所帮助的blog和文章
- hdoj-2039-三角形
- hdoj-2035-人见人爱a^b
- codeforces 655D D. Robot Rapping Results Report(拓扑排序+拓扑序记录)
- C#中的try catch finally
- 振兴中华--蓝桥杯
- swfupload 禁掉了IE9的javascript 的运行,解决方案如下
- hdoj-2028-Lowest common multiple plus
- hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b
- 程序设计第三次作业---C++计算器雏形
- 《C语言程序设计》指针篇<二>
- 《C语言程序设计》指针篇<一>
- 《算法竞赛入门经典》刘汝佳 C语言部分(前四章)“注解与习题” 之思索 <1>
- 程序设计第二次作业<2>
- 程序设计第二次作业<1>
- 第一次面向对象程序设计作业-大一下学期的自我目标
- A.S. -prompt tips -2b contnd.