迷宫问题

原创 2016年08月30日 20:15:24
Description

#include<iostream>
#include<cstring>
using namespace std;
struct node//结构名
{
	int x, y;//成员
};
node np[40], mp[40];//变量
int map[10][10];
bool vis[10][10];
int dir[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };//分别表示向右,下,左,上走
int res;
void dfs(int x, int y, int dep)//dfs表示深度搜素
{
	if (x == 4 && y == 4)//判断是否到达终点
	{
		if (res> dep)
		{
			res = dep;
			for (int i = 0; i < dep; i++)
			{
				mp[i].x = np[i].x;
				mp[i].y = np[i].y;
			}
		}
		return;
	}
	for (int i = 0; i < 4; i++)
	{
		int tx = x + dir[i][0];//计算下一个位置的坐标
		int ty = y + dir[i][1];
		if (tx < 0 || tx >= 5 || ty < 0 || ty >= 5)//判断是否越界
			continue;
		if (map[tx][ty] == 0&&!vis[tx][ty])//判断该点是够为障碍物或者已经在路径中
		{
			vis[tx][ty] = true;//标志这个点已经走过
			np[dep].x = tx;//将这个位置的坐标赋值给x,也就是保存路径
			np[dep].y = ty;//将这个位置的坐标赋值给y
			dfs(tx, ty, dep + 1);//开始尝试下一个点
			vis[tx][ty] = false;//尝试结束,取消这个点的标记
		}
	}
	return;
}
int main()
{
	for (int i = 0; i<5; i++)
		for (int j = 0; j<5; j++)
			cin >> map[i][j];
	memset(vis, 0, sizeof(vis));//将数组初始化为0
	memset(np, 0, sizeof(np));
	memset(mp, 0, sizeof(mp));
	vis[0][0] = true;//标志路径已经在起点上,防止后面重复走
	np[0].x = np[0].y = 0;
	res = 0x7ffffff;
	dfs(0, 0, 1);
	for (int i = 0; i<res; i++)
		cout << '(' << mp[i].x << ", " << mp[i].y << ')' << endl;//输出最短步数的坐标
	return 0;
}
	return;
}

int main()
{
	for (int i = 0; i<5; i++)
		for (int j = 0; j<5; j++)
			cin >> map[i][j];
	memset(vis, 0, sizeof(vis));
	memset(np, 0, sizeof(np));
	memset(mp, 0, sizeof(mp));
	vis[0][0] = true;
	np[0].x = np[0].y = 0;
	res = 0x7ffffff;
	dfs(0, 0, 1);
	for (int i = 0; i<res; i++)
		cout << '(' << mp[i].x << ", " << mp[i].y << ')' << endl;
	return 0;
}


定义一个二维数组: 


int maze[5][5] = {


0, 1, 0, 0, 0,


0, 1, 0, 1, 0,


0, 0, 0, 0, 0,


0, 1, 1, 1, 0,


0, 0, 0, 1, 0,


};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input


一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output


左上角到右下角的最短路径,格式如样例所示。
Sample Input


0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output


(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构例程——迷宫问题(用队列)

数据结构例程——表达式求值(用队列)  本文针对数据结构基础系列网络课程(3):栈和队列中第5课时队列的应用-迷宫问题。例:求出从入口到出口的路径 代码:#include #define MaxS...
  • sxhelijian
  • sxhelijian
  • 2015年09月15日 11:48
  • 6690

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

1.问题简介给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem)。迷宫可以以二维数组来存储表示。0表示通路,1表示障碍。注意这里规定移动可以从上、...
  • K346K346
  • K346K346
  • 2016年05月02日 11:27
  • 14634

poj 迷宫问题(简单题)

迷宫问题,思路: 基础题,弄懂队列原理就ok。
  • kaisa158
  • kaisa158
  • 2015年07月10日 16:44
  • 1738

迷宫问题算法设计与实现

迷宫问题算法的实现(基于队列版本和回朔法版本)
  • u011889952
  • u011889952
  • 2015年04月01日 13:01
  • 3308

运用栈求解迷宫问题C/C++

用栈解决基本的迷宫问题C/C++ 1、问题描述:设置迷宫为m*n的二维数组,起点坐标为(1,1),中点坐标为(m,n),0为通路,1为死路,为防止数组越界将四周设置边界1,即数组变为(m+2)*(n...
  • g15827636417
  • g15827636417
  • 2016年10月07日 16:18
  • 4963

POJ 3984 迷宫问题 广搜迷宫解法

本题是经典的迷宫搜索问题了,使用广搜比使用深搜效率要高。 思路关键点: 1 从终点出发查找起点,这样方便记录路径 2 每次查找到下一个空格,可走方格之后,可以马上标识该格为不可走了 3 找到起点之后,...
  • kenden23
  • kenden23
  • 2014年10月29日 09:55
  • 2078

C++实现迷宫问题

新建一个.txt文档来存储迷宫,输入n*n的迷宫矩阵并保存起来,如下图650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/80/0F/w...
  • clown05
  • clown05
  • 2016年05月30日 00:56
  • 338

数据结构迷宫问题

一、实验的目的和要求 1、了解栈的特征,以及顺序表在迷宫问题中的应用。 2、掌握顺序栈在迷宫问题如何实现,熟练掌握顺序栈的基本操作。 二、实验的主要内容 问题描述:在迷宫中求从...
  • bingheliushui520
  • bingheliushui520
  • 2014年04月10日 21:27
  • 3196

经典迷宫问题1

1.迷宫问题直观感受     下面给出迷宫问题的一个直观感受图,下图中棕色代表通道阻塞,白色代表可用通道,红色代表起始位置,绿色代表当前位置,黄色代表出口。 迷宫1: 迷宫2: ...
  • ghuilee
  • ghuilee
  • 2015年11月27日 13:09
  • 2112

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目。【项目 - 迷宫问题之图深度优先遍历解法】   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。   (1)建立迷宫对应的图数据结构...
  • sxhelijian
  • sxhelijian
  • 2015年11月08日 15:36
  • 5979
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迷宫问题
举报原因:
原因补充:

(最多只允许输入30个字)