迷宫问题的求解方式:应用深度优先和广度优先的搜索

用堆栈实现迷宫问题,二维数组表示迷宫:1表示墙壁,0表示可以走的路,只能横着走或竖着走

不能斜着走,要求编程实现找到从左上角到右下角的路线

//深度优先:有解就退出搜索(不一定是最优解)
#include<iostream>
#include<stdio.h>
using namespace std;
#define ROW 5
#define COL 5
typedef struct point
{
	int _row;
	int _col;
}Point;
Point stack[512];
int top= 0;
void Push(Point& p)
{
	stack[top++] = p;
}
const Point& Pop()
{
	return stack[--top];
}
int IsEmpty()
{
	return top==0;
}
int maze[ROW][COL] = {
		{ 0, 0, 0, 0, 0 },
		{ 0, 1, 1, 1, 0 },
		{ 0, 1, 1, 0, 0 },
		{ 0, 1, 1, 0, 1 },
		{ 0, 0, 0, 0, 0 },
};
void PrintMaze()
{
	for (int i = 0; i < ROW; ++i)
	{
		for (int j = 0; j < COL; ++j)
		{
			cout << maze[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
Point Prev[ROW][COL] = {
		{ { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 } },
		{ { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 } },
		{ { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 } },
		{ { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 } },
		{ { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 } },
};
void Visit(int row, int col,Point& p)
{
	Point tmp = { row, col};
	maze[row][col] = 2;
	Prev[row][col] = p;
	Push(tmp);
}
void Test1()
{
	Point p = { 0, 0};
	maze[p._row][p._col] = 2;
	Push(p);

	while (!IsEmpty())
	{
		p = Pop();
		if (p._row == ROW - 1 && p._col == COL - 1)
			break;

		//up
		if (p._row - 1 >= 0 && maze[p._row - 1][p._col] == 0)
			Visit(p._row - 1, p._col,p);
		//down
		if (p._row + 1 < ROW&&maze[p._row + 1][p._col] == 0)
			Visit(p._row + 1, p._col,p);
		//left
		if (p._col - 1 >= 0 && maze[p._row][p._col - 1] == 0)
			Visit(p._row, p._col - 1,p);
		//right
		if (p._col + 1 < COL&&maze[p._row][p._col + 1] == 0)
			Visit(p._row, p._col + 1,p);
	}
	if (p._row == ROW - 1 && p._col == COL - 1)
	{
		printf("(%d,%d)\n", p._row, p._col);
		while ((Prev[p._row][p._col])._row != -1)
		{
			p = Prev[p._row][p._col];
			printf("(%d,%d)\n", p._row, p._col);
		}
	}
	else
		cout << "no path!\n";
}

//广度求得最优路径,找到后停止搜索
#include<iostream>
using namespace std;
#define ROW 5
#define COL 5
typedef struct point
{
	int _row;
	int _col;
	int _prev;
}Point;
Point queue[512];
int head = 0;
int tail = 0;
void Enqueue(Point& p)
{
	queue[tail++] = p;
}
const Point& Dequeue()
{
	return queue[head++];
}
int IsEmpty()
{
	return head == tail;
}
int maze[ROW][COL] = {
		{ 0, 0, 0, 0, 0 },
		{ 0, 1, 1, 1, 0 },
		{ 0, 1, 1, 0, 0 },
		{ 0, 1, 1, 0, 1 },
		{ 0, 0, 0, 0, 0 },
};
void PrintMaze()
{
	for (int i = 0; i < ROW; ++i)
	{
		for (int j = 0; j < COL; ++j)
		{
			cout << maze[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
void Visit(int row, int col)
{
	Point tmp = { row, col, head - 1 };
	maze[row][col] = 2;
	Enqueue(tmp);
}
void Test1()
{
	Point p = { 0, 0, -1 };
	maze[p._row][p._col] = 2;
	Enqueue(p);

	while (!IsEmpty())
	{
		p = Dequeue();
		if (p._row == ROW - 1 && p._col == COL - 1)
			break;
         
		//up
		if (p._row - 1 >= 0 && maze[p._row - 1][p._col] == 0)
			Visit(p._row - 1, p._col);
		//down
		if (p._row + 1 < ROW&&maze[p._row + 1][p._col] == 0)
			Visit(p._row + 1, p._col);
		//left
		if (p._col - 1 >= 0 && maze[p._row][p._col - 1] == 0)
			Visit(p._row, p._col - 1);
		//right
		if (p._col + 1 < COL&&maze[p._row][p._col + 1] == 0)
			Visit(p._row, p._col + 1);
	}
	if (p._row == ROW - 1 && p._col == COL - 1)
	{
		printf("(%d,%d)\n", p._row, p._col);
		while (p._prev != -1)
		{
			p = queue[p._prev];
			printf("(%d,%d)\n", p._row, p._col);
		}
	}
	else
		cout << "no path!\n";
}

时间: 2024-12-11 16:50:21

迷宫问题的求解方式:应用深度优先和广度优先的搜索的相关文章

迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解

1.问题简介 给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem). 迷宫可以以二维数组来存储表示.0表示通路,1表示障碍.注意这里规定移动可以从上.下.左.右四方方向移动.坐标以行和列表示,均从0开始,给定起点(0,0)和终点(4,4),迷宫表示如下: int maze[5][5]={ {0,0,0,0,0}, {0,1,0,1,0}, {0,1,1,0,0}, {0,1,1,0,1}, {0,0,0,0,0} }; 那么下面的迷宫就有两条

数据结构设计——用队列实现迷宫问题的求解

1,问题描述 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论. 基本要求: 首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路,其中:(i,j)指示迷宫中的一个坐标, d表示走到下一坐标的方向. 左上角(1,1)为入口,右下角(m,n)为出口. 2.设计思路: 用队列实现迷宫问题的求解: 3.实验代码: 队列实现: *************************

递归式的三种求解方式

求解递归式对于分冶算法的重要性不言而喻 以下介绍了三种求解递归式的方法 1,代换法: 缺点:代换法主要的缺点在于,对于任何递归式,我们先得去猜其解,对于猜错了同学,如果不幸猜出的结果和正确结果相差太大,虽然可以推导,但是意义不大: 优点:代换法相较于递归树法更为严谨,相较于主定理应用范围更广,主定理只能求解类似于T(n) = aT(n/b)+n/c这种形式的递归式: 下面给出一个递归表达式T(n) = 2T(n/2)+n,求其解: 首先猜一下其解为O(nlgn);那么我们只需要证明T(n)<cn

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

数据结构之深度优先,广度优先遍历

深度优先和广度优先遍历在树和图中应用最为普遍,思想也类似,因此放到一起来总结. 二叉树的深度优先广度优先遍历: 一棵二叉树(2,(2(3,4),3(4,5))),这是一棵满二叉树,一共有7个节点,根节点2,深度为3 数据结构定义如下: class Node: def __init__(self, value=None, left = None, right = None): self.value = value self.left = left self.right = right 先根遍历 d

数据结构:图的遍历--深度优先、广度优先

图的遍历:深度优先.广度优先 遍历 图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点.当然,每个顶点有且只能被访问一次. 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式.这两种遍历方式对无向图和有向图都是适用的,并且都是从指定的顶点开始遍历的.先看下两种遍历方式的遍历规则: 深度优先 深度优先遍历也叫深度优先搜索(Depth First Search).它的遍历规则:不断地沿着顶点的深度方向遍历.顶点的深度方向是指它的邻接点方向. 具体点,给定一图G=<V,E>,

ES优化聚合查询之深度优先和广度优先

1.优化聚合查询示例 假设我们现在有一些关于电影的数据集,每条数据里面会有一个数组类型的字段存储表演该电影的所有演员的名字. { "actors" : [ "Fred Jones", "Mary Jane", "Elizabeth Worthing" ] } 如果我们想要查询出演影片最多的十个演员以及与他们合作最多的演员,使用聚合是非常简单的: { "aggs" : { "actors"

爬了个爬(二)性能相关 及 深度优先与广度优先

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行