实现简单的迷宫

我们知道栈的特点是:后进先出First In Last Out);也就是说只能在栈的尾部进

行压栈和出栈,而且出栈的时候只能从最后一个数据开始。

  所以我们利用栈这个特点,来实现这个迷宫。在这之中我们要采用“回溯”的方法去处理当遇到路径不通的情况。

  原理:每找到一个通路,就将这个数据压栈,这样当前位置的上一个位置就位于栈的顶部,假如当前位置的上下左右都找不到通路的时候,就开始回溯,也就是开始从来的路往回走,而之前走过的路都存在栈里面,所以只需要一个一个的Pop就能依次往回退,每退一次,就寻找上下左右有没有通路,如果找到通路就继续往下走,并压栈,直到走出整个迷宫。

#define _CRT_SECURE_NO_WARNINGS 1
#include"MazeMap.h"
#include<stdio.h> 

void test()
{
	int a[N][N];
	GetMaze((int*)a, N);
	stack<pos> paths;
	pos entry = { 2, 0 };
	cout << searchpath((int*)a, 10, entry, paths)<<endl;
	display((int*)a, N);
}
int main()
{
	test();
	system("pause");
	return 0;
}
#pragma once
#include<stack>
#include<assert.h>

#define N  10
#include<iostream>
using namespace std;

struct pos
{
	int _row;
	int _col;
};
void GetMaze(int* a, int n)     
{
	assert(a);
	FILE* fout = fopen("C:\\maze.txt", "r");
	assert(fout);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n;)
		{
			char ch = fgetc(fout);
			if (ch == ‘1‘ || ch == ‘0‘) //只读有效的字符,遇空格不转换
			{
				a[i * n + j] = ch - ‘0‘;
				j++;
			}
			else
			{
				continue;
			}
		}
	}
	fclose(fout);
}
bool CheckisAccess(int *a, int n, const pos& next)//检查当前的路径是否通行
{
	int row = next._row;
	int col = next._col;
	if (row >= 0 && row < n&&col >= 0 && col < n&&a[next._row*n + next._col] == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool searchpath(int* a, int n, pos entry, stack<pos>& paths)
{
	assert(a);
	paths.push(entry);     //将入口地址(坐标)push到栈中
	while (!paths.empty())  //如果栈为空,就没找到出口
	{
		pos cur = paths.top();     
		a[cur._row*n + cur._col] = 2;  //将走过的路径置为2
		if (cur._row == n - 1)
		{
			return true;
		}
		pos next = cur;     //先将cur赋给next  为了下面如果next改变后不满足,                 next._row--;//上                          
		if (CheckisAccess(a, n, next))
		{
			cur = next;
			paths.push(cur);
			continue;
		}

		next = cur;
		next._col++;//右
		if (CheckisAccess(a, n, next))
		{
			cur = next;
			paths.push(cur);
			continue;
		}
		next = cur;
		next._row++;//下
		if (CheckisAccess(a, n, next))
		{
			cur = next;
			paths.push(cur);
			continue;
		}
		next = cur;
		next._col--;// 左
		if (CheckisAccess(a, n, next))
		{
			cur = next;
			paths.push(cur);
			continue;
		}
		next = cur;
		paths.pop();     //如果遇到不通(在此即四个方向都不为0)然后,让栈中保存
	}                              的坐标pop(即往回倒)重复试探四个方向 直到找到另一

	return false;                   条可通路径;
}
void display(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;
	}

}

至此,一个简单的迷宫就完成了,以上左边的图就是开始的迷宫。右边的图是结果。最终,每次走过的地方都被标志成2.

时间: 2024-08-17 06:49:19

实现简单的迷宫的相关文章

20150917学习内容: 数组,简单的迷宫操作

数组:有固定长度的同种类型的一组变量,有索引,索引从0开始. Int [ ]shuzu = new int[5]; shuzu [0] = 4; shuzu [1] = 6; 或直接赋值: int[]shuzu = new int[5]{2,4,5,7,9}; Console.Write(shuzu[3]); Console.Readline(); 这是一维数组, 二维数组是: int[,] erwei = new int[2,5];   =========>两个长度为5的一维数组 赋值: In

简单的迷宫(bfs)noj1793

题目描述 睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么… 不管那么多了,还是先离开为妙.不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么? 这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M).除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点. 输入 组数据输入. 每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2, 接下来k行,每行

经验分享:三套简单的迷宫地图生成方案

转自:http://www.gameres.com/754927.html 概述:文章基于一种基础的地图,来讨论三套不同的地图生成方案. 文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案.其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样,适合自己游戏的才是最好的). 根据方案生成地图之后,还可以加上一些静态分布来丰富地图表现,大家就自行发挥啦! 地图基础 地图的形式很多,这里我使用的地图是以tile块为单位分割的地

栈的简单应用-迷宫问题

                                             迷宫问题 迷宫问题一直是计算机工作者感兴趣的问题,因为它可以展现栈的巧妙应用, 这里将利用栈开发一个走迷宫程序,虽然在发现正确路径前,程序要尝试许多 错误路径,但是,一旦发现,就能够重新走出迷宫,而不会再去尝试任何错误路径. 迷宫问题求解 计算机中可以用如图所示的方块图表示迷宫.图中空白方块为通道,蓝色方块为墙 迷宫的储存可以使用二维数组,其中"0"代表墙值,"1"代表通路.由

uestc 一个简单的迷宫问题

我不知道化成网格线什么意思啊... :( 如果我写一步一搜的话肯定很麻烦.. 大牛代码  理解以上两点之后再重新做..sigh~ 1 #include <iostream> 2 #include <stdio.h> 3 #include <queue> 4 #include <string.h> 5 using namespace std; 6 int n,m; 7 int map[55][55]; 8 bool vis[4][55][55]; 9 stru

bfs简单应用----迷宫问题

[week2-A] 东东有一张地图,想通过地图找到妹纸.地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0.既然已经知道了地图,那么东 东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线. Input 输入是一个5 × 5的二维数组,仅由0.1两数字组成,表示法阵地图. Output 输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示.数据保证有唯一解. Sample Input 0 1 0 0 00 1 0 1 00 1 0

AI-随机迷宫&amp;迷宫求解

本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机迷宫 迷宫求解没有迷宫怎么可以呢.而本人是个懒人,每次都要手动输入迷宫,重复性的工作让我很不爽.你可以在程序中用数组定义一个迷宫啊,有强迫症的我,怎么可以这样随便的要求自己的程序呢.及时求解算法的出来了,但是测试数据有限,还是让我很不爽的,所以,干脆先花一些时间,写个随机迷宫的产生吧. 遇事先搜索,

栈实现迷宫求解(c++版)

相信大家都应该听过栈吧,一直想利用栈来实现一个算法,最近有点空,就利用栈的先进后出的特性来完成迷宫求的问题,下面将详细介绍栈的实现和迷宫求解的过程,可以很好的学习栈的使用. 栈有两种实现方法,一种是顺序,即数组形式,一种是线性,即链表形式,个人还是比较喜欢链表形式实现栈的基本功能. 首先弄一个简单的迷宫,如图: 我们很容易看出这个迷宫解的路径,那怎么让计算机帮我们求解出来呢. 首先我们要对迷宫数据化,很容易想到二维数组来表示,0表示通路,1表示障碍,即表示为: int map[4][4]={ {

栈求解迷宫问题

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