走迷宫2(深度优先)

1、走迷宫深度优先算法原理
对于图的遍历有主要有两种比较经典的算法,广度和深度优先遍历,广度优先遍历的关键在与构建
遍历图的一队列。具体的深度的原理,一般算法分析的书籍上面都有详细的说明,简单的来说就是,深度
优先就是沿着一个方向一直走下去,如果找到出口则输出路径,如果没有找到则回退回来继续下一路劲,所以对图的深度搜索用栈存储就够比较方便。
2、具体的代码
代码是对一个5*6的图进行的遍历,图中1代表障碍,0代表通路,入口(0,1)->出口(3,5)。
从图中可以看到一共有两条路径,我们找出所有的路径并输出(因为本文用的是STL<stack>所以输出的路径是反序的,可以参见改进的一篇文章用的是STL 的<list>代替了<stack>)。
1 0 1 1 1 1
1 0 1 0 0 0
1 0 0 0 1 0
1 1 0 0 0 0
1 1 1 0 1 1
/*+++++++++++++++++++++++++++++++
+	走迷宫2(C版)
+
+	深度遍历算法,输出所有路经。
+主要思想用栈。
+author:zhouyongxyz			2013-4-14 9:00
++++++++++++++++++++++++++++++++++++++++++*/
#include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;

#define M 5
#define N 6

struct node
{
	int x,y;
	node(){x=y=0;};
};
int vis[M][N];
static int dx[]={-1,1,0,0};
static int dy[]={0,0,-1,1};

void print_ans(stack<node> s);

int main()
{
	int a[M][N]={
		{1,0,1,1,1,1},
		{1,0,1,0,0,0},
		{1,0,0,0,1,0},
		{1,1,1,0,0,0},
		{1,1,1,0,1,1}
	};
	stack<node> stack;
	struct node u,v;
	int flag;
	u.x=0,u.y=1;
	stack.push(u);
	while(!stack.empty())
	{
		u=stack.top();
		if(u.x==3&&u.y==5)
		{
			print_ans(stack);
			vis[u.x][u.y]=0;
			/*
			回退两步,这样代码容易实现,这也符合正常的逻辑思维,一步就能
			到达目的地,没有必要要绕一大圈。
			*/
			stack.pop();		
			stack.pop();
			u=stack.top();
			
		}
		flag=0;
		for(int i=0;i<4;i++)
		{
			int newx=u.x+dx[i],newy=u.y+dy[i];
			if(newx>=0&&newx<M&&newy>=0&&newy<N&&!vis[newx][newy]&&a[newx][newy]==0)
			{
				v.x=newx;
				v.y=newy;
				stack.push(v);
				flag=1;
				vis[newx][newy]=1;
				break;
			}
		}
		if(!flag)
			stack.pop();
	}
	return 0;
}

void print_ans(stack<node> s)
{
	struct node n;
	while(!s.empty())
	{
		n=s.top();
		printf("(%d,%d) ",n.x,n.y);
		s.pop();
	}
	printf("\n");
}


 
发布了35 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ZHOUYONGXYZ/article/details/8798922
今日推荐