Algorithm
BFS & DFS
本篇文章讨论一个最基础寻路场景 迷宫 在DFS BFS 中怎样求解
基础数据:
0#000000#*#########
0###0#00#0000000000
000#0#00##########0
#0000#00#0000000000
######00#0000######
00000000#0000000000
0000#00##########00
0000#00000000000000
0000#00000000000000
0000#00000000000000
0000#00000000000000
0000#0#############
0000000000000000000
0000000000000000000
0000000000000000000
0000000000#########
0000000000##0000000
00000#######0000000
0000000000000000000
0000000000000000000
此图为一个 202 大小的图 以任意坐标如x=0,y=0则为从左上角开始出发 符号#则为不能穿过
开始 直到寻找到*为结束 最后将路径输出为符号 (.)
基础框架
节点类
class node
{
public:
int x,y;
int count;
node():x(0),y(0),count(0){};
node(int a,int b,int c){x=a;y=b;count=c;}
};
访问标记
如果图为二维数组的话 一般需要设置一个同样大小的访问标记图 以判断该点是否被走过了从而避免向回扫描 或者重复走
以一个布尔数组来定义
bool visited[mapsize][mapsize]
扫描方向
在一般的题目中可能出现的有两种形式即四方向 上下左右
int dir[4][2]={0,1,0,-1,1,0,-1,0}; //方向
和八方向 上下左右 以及偏方向 上左…下右
int dir[8][2]={0,1 ,0,-1 ,1,0, -1,0
-1,-1 ,-1,1 ,1,1, 1,-1};
或者
int dx[8]={
0,0,1,1,1,-1,-1,-1};
int dy[8]={
1,-1,1,0,-1,1,0,-1};
约束条件
此部分是为了防止访问超出边界或者图中的阻隔元素。
bool check(int x,int y)
{
if(x<0||x>=mapsize||y<0||y>=mapsize||map[x][y]=='#'||vis[x][y]==true||map[x][y]==0)
return true;
else return false;
}
DFS 递归 与 栈
使用栈来保存未被检测的点 节点按照深度优先次序被访问并依次入栈 并以相反的次序出栈进行新的检测
void DFS2(node s)//非递归DFS
{
cout<<"______________DFS___________"<<endl;
stack <node> p;
p.push(s);
vis[s.x][s.y]=true;
while(!p.empty())
{
node now = p.top();
//现在的位置是刚刚被推进栈顶的位置 由于先进后出所以向更深处搜索
p.pop();//出队一个元素
if(map[now.x][now.y]=