栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

DFS深搜寻找迷宫最短路径

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DFS深搜寻找迷宫最短路径

 (左:迷宫    右: 最短路径)

 

 代码:

#include
#include
#include
#define N 1001
using namespace std;

struct St
{
	int x;
	int y;
}s[N],sMin[N];//记录路径坐标的栈

int Map[25][25] = {
	//迷宫地图
	   {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	   {1,1,1,3,3,3,3,3,1,1,1,1,1,3,3,3,3,3,1,1,1},
	   {1,1,3,1,1,1,1,1,3,1,1,1,3,1,1,1,1,1,3,1,1},
	   {1,3,1,1,0,0,0,1,1,3,1,3,1,1,0,0,0,1,1,3,1},
	   {3,1,1,0,1,1,1,0,1,1,3,1,1,0,1,1,1,0,1,1,3},
	   {3,1,0,1,1,0,1,1,0,1,9,1,0,1,1,0,1,1,0,1,3},
	   {3,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,3},
	   {3,1,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,1,0,1,3},
	   {3,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,0,1,1,3},
	   {1,3,1,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,1,3,1},
	   {1,1,3,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,3,1,1},
	   {1,1,1,3,1,0,1,0,1,0,1,0,1,0,1,0,1,3,1,1,1},
	   {1,1,1,1,3,1,0,1,1,0,1,0,1,1,0,1,3,1,1,1,1},
	   {1,1,1,1,1,3,1,0,1,0,1,0,1,0,1,3,1,1,1,1,1},
	   {1,1,1,1,1,1,3,1,1,0,1,0,1,1,3,1,1,1,1,1,1},
	   {1,1,1,1,1,1,1,3,1,1,0,1,1,3,1,1,1,1,1,1,1},
	   {1,1,1,1,1,1,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1},
	   {1,1,1,1,1,1,1,1,1,3,4,3,1,1,1,1,1,1,1,1,1},
	   {1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1},
	   {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
	   {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}
};
int stepMap[N][N];//路径地图
int flag[N][N];//标记地图
int dx[4] = {1, 0, -1, 0};//方向数组
int dy[4] = {0, 1, 0, -1};//上右左下
int k = 1;//n:行列数
int stepMin = N;
int Beginx, Beginy, Endx, Endy;
int bound = 21;

void oldMap()
{
	for (int i = 0; i < bound; i++)
	{
		for (int j = 0; j < bound; j++)
		{
			cout << Map[i][j] << ' ';
		}
		cout << endl;
	}	
}

void findAim()
{
	for (int i = 0; i < bound; i++)
	{
		for (int j = 0; j < bound; j++)
		{
			if (Map[i][j] == 9)
			{
				Beginx = i;
				Beginy = j;
				Map[Beginx][Beginy] == 1;
			}
			if (Map[i][j] == 4)
			{
				Endx = i;
				Endy = j;
				Map[Endx][Endy] == 1;
			}
		}
	}
}

void Min()
{
	memset(sMin, 0, sizeof(sMin));//结构体数组初始化用来存储最短路径
	for (int i = 0; i < stepMin; i++)
	{
		sMin[i] = s[i];//将坐标栈的坐标存入sMin数组中
	}
}

void Output()
{
	for (int i = 0; i < stepMin; i++)
	{
		int x = sMin[i].x;
		int y = sMin[i].y;
		stepMap[x][y] = 1;//将最短路径标记在路径地图中
	}
	for (int i = 0; i < bound; i++)//输出地图
	{
		for (int j = 0; j < bound; j++)
		{
			cout << stepMap[i][j] << ' ';
		}
		cout << endl;
	}
}

void DSF(int x, int y,int step)
{
	if (x == Endx - 1 && y == Endy - 1)
	{//到达终点输出
		if (step < stepMin)
		{
			stepMin = step;
			Min();
		}
		return;
	}

	int tx, ty;
	for (int i = 0; i < 4; i++)
	{
		tx = x + dx[i];
		ty = y + dy[i];
		if (tx <= bound && ty <= bound)//判断是否越界
		{
			if (flag[tx][ty] == 0 && Map[tx][ty] == 1)
			{
				flag[tx][ty] = 1;
				s[k].x = tx;//记录路径上的坐标 (入栈)
				s[k++].y = ty; //记录路径上的坐标(入栈)
				DSF(tx, ty, k + 1);//前往下一个点
				flag[tx][ty] = 0;//回溯(走过的路退回)
				k--;//出栈
			}
		}
	}
}

int main()
{
	memset(flag, 0, sizeof(flag));//标志数组置零
	oldMap();//输出原图
	findAim();//寻找目标点
	DSF(Beginx, Beginy, 0);//神搜最短路径
	Output();//输出最短路径
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648114.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号