网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

栈求解迷宫问题

    求迷宫从入口到出口的所有路径是一个经典的程序设计问题。一般的设计思想就是从入口出发,顺着某个方向向下探索,探索分为上下左右四个方位,哪个方向是通的就将向下走,如果每个方向都走不下去就进行原路“回退”。所以需要一个后进先出的结构来保存从入口到出口的路径。所以运用栈来实现是非常方便的,沿着某个方向走,将每个可通的位置进行入栈标记,再切换到下个位置;如果都不通,则栈顶出栈取消标记,再寻找。下来呢就实现一个简单的迷宫求解问题(求解出一条通路就好),至于求解多条通路并且求出最短路径的问题呢我还在进一步的学习中。

站在用户的角度思考问题,与客户深入沟通,找到五原网站设计与五原网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站制作、企业官网、英文网站、手机端网站、网站推广、申请域名、网络空间、企业邮箱。业务覆盖五原地区。

    在给出代码之前先来看一下如何动态开辟一个二维数组?

int *a = new int[N*N];
int** a=new int*[N];
//a[i][j] 等价于 a[i*N + j];

    好了,现在来看迷宫的具体实现:

#define _CRT_SECURE_NO_WARNING
#pragma once
#include
#include
#include
using namespace std;
#define N 10
struct Pos
{
	Pos(size_t row, size_t col)
		:_row(row)
		, _col(col)
	{}
	int _row;
	int _col;
};
void GetMaze(int *a,int n)//读入文件
{
	FILE* fout = fopen("MazeMap.txt", "r");
	assert(fout);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n;)
		{
			char ch = fgetc(fout);
			if ('0' == ch || '1' == ch)
			{
				a[i*n + j] = ch - '0';
				j++;
			}
			else
			{
				continue;
			}
		}
	}
	fclose(fout);
}
void PrintMaze(int* a,int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << a[i*n + j]<<" ";
		}
		cout << endl;
	}
}
bool CheckIsAccess(int* a, int n, Pos next)
{
	assert(a);
	if ((next._row >= 0) && (next._row < n) && (next._col >= 0) && (next._col < n)&&(a[next._row*n+next._col]==0))
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool MazePath(int* a, int n, const Pos& entry, stack& path)
{
	Pos cur = entry;//入口位置
	path.push(cur);
	while (!path.empty())
	{
		//是否已经到出口
		if (cur._row == n - 1)
		{
			a[cur._row*n + cur._col] = 2;
			return true;
		}
		a[cur._row*n + cur._col] = 2;

		//*****************************************上
		Pos next = cur;
		next._row--;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************下
		next = cur;
		next._row++;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************左
		next = cur;//左
		next._col--;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}

		//*****************************************右
		next = cur;
		next._col++;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}
		cur = path.top();//到这说明没有通路,所以栈顶出栈
		path.pop();
	}
	return false;
}
void TestMaze()
{
	int a[N][N] = {};
	GetMaze((int *)a,N);
	PrintMaze((int *)a, N);
	stack path;
	Pos entry = { 2, 0 };
	bool ret = MazePath((int *)a, N, entry, path);
	cout << "是否有通路?" << ret << endl;
	PrintMaze((int *)a, N);
}

栈求解迷宫问题

当迷宫有多个出口时,利用全局栈可以求得最短路径。这个我们下次再议栈求解迷宫问题


当前标题:栈求解迷宫问题
网站链接:http://bjjierui.cn/article/jjheoe.html

其他资讯