用BFS解决迷宫问题

在一个n*n的矩阵里走,从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走,求最短步数。n*n是01矩阵,0代表该格子没有障碍,为1表示有障碍物。

int mazeArr[maxn][maxn]; //表示的是01矩阵

int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4个方向

int visit[maxn][maxn]; //表示该点是否被访问过,防止回溯,回溯很耗时。

解题思路:

BFS找出来的是最短路径,如果用DFS,那么寻找出来的不是最短路径。

我们先对原点的上下左右进行访问,如果上下左右的点非障碍物,并且还没访问过,那么就将这些点入队列,并设置为已经访问,然后再依次把这些点出队列,并且重复之前的步骤对这些点的进行上下左右访问。。。。如果最后访问到终点(n-1,n-1),则结束

代码如下:

#include<iostream>
using namespace std;

//定义迷宫的行列
#define ROW_COL  4   

//定义一个结构体,表示经过的点路径
struct Node
{
	int x;
	int y;
	int step;
};

//赋值
Node fuzhi(int x,int y,int step)
{
	Node p;
	p.x=x;
	p.y=y;
	p.step=step;
	return p;
}

//实现一个循环队列
//=====================================
#define QueueSize 30
typedef struct
{
	Node Seq[QueueSize];
	int front;
	int rear;
	int count;
}RQueue;

RQueue Q;

void Initiate_Queue(RQueue *Q)
{
	Q->front=0;
	Q->rear=0;
	Q->count=0;
}

void AppendQueue(RQueue *Q,Node data)
{
	if(Q->count>=QueueSize)
	{
		cout<<"overflow"<<endl;
		return ;
	}
	Q->Seq[Q->rear]=data;
	Q->rear=(Q->rear+1)%QueueSize;
	Q->count++;
}

int QueueNotEmpty(RQueue *Q)
{
	if(Q->count!=0)
		return 1;
	else
		return 0;
}

Node DeleteQueue(RQueue *Q)
{
	if(Q->count<=0)
	{
		cout<<"empty"<<endl;
		exit(0);
	}
	Node d;
	d=Q->Seq[Q->front];
	Q->front=(Q->front+1)%QueueSize;
	Q->count--;
	return  d;
}

//=======================

//迷宫图的矩阵
int mazeArr[4][4]=
{
	{0,0,1,1},
	{0,1,1,0},
	{0,0,1,0},
	{0,1,0,0}
};

int visit[ROW_COL][ROW_COL];

//表示上下左右
int stepArr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

//对其进行BFS,找出的路径为最短路径,注意二位数组的形参是int (*mazeArr)[4]
int BFS(int (*mazeArr)[4],Node node,int n)
{
	for(int i=0;i<ROW_COL;i++)
		for(int j=0;j<ROW_COL;j++)
			visit[i][j]=0;
	Node N;
	Initiate_Queue(&Q);
	AppendQueue(&Q,node);
	while(QueueNotEmpty(&Q))
	{
		N=DeleteQueue(&Q);
		if(N.x==n-1 &&N.y==n-1)
		{
			return N.step;
		}
		visit[N.x][N.y]=1;
		//对该点的上下左右进行遍历,如果符合条件,就入队列
		for(int i=0;i<4;i++)
		{
			int x=N.x+stepArr[i][0];
			int y=N.y+stepArr[i][1];
			if(x>=0 &&y>=0&&x<n&&y<n&&!visit[x][y]&& mazeArr[x][y]==0)
			{
				visit[x][y]=1;
				N=fuzhi(x,y,N.step+1);
				AppendQueue(&Q,N);
			}
		}
	}
	return -1;
}

void main()
{
	Node node;
	node=fuzhi(0,0,0);
	cout<<BFS(mazeArr,node,ROW_COL);
	getchar();
}
时间: 2024-10-26 05:24:18

用BFS解决迷宫问题的相关文章

有关dfs、bfs解决迷宫问题的个人见解

可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是她能到达的,最近的出口离她有多远? 输入描述: 第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30) 后面紧跟着n行长度为m的字符串来描述迷宫.'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口.保证输入合法. 输出描述: 若有出口可以抵达,则输出2个整数,

hdu1180诡异的楼梯……bfs走迷宫……wa了16次,我太渣了

#include<iostream> #include<queue> #include<cstring> using namespace std; int row,line,xx[4]={-1,1,0,0},yy[4]={0,0,-1,1}; char map[100][100]; bool vis[100][100]; struct node { int x,y,step; }st; void init() { int i,j; bool flag=1; for(i=

C语言 解决迷宫问题练习

利用C语言来解决类似迷宫的问题,下面例子分别用两种方法来解决! [Problem] There is a maze as shown in the diagram below. In the maze in the form of a 100*100 matrix, the white background represents the road while the yellow background represents the wall. Assuming the upper left co

每天刷个算法题20160526:BFS解决八数码问题(九宫格问题)

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524864 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

[LeetCode] BFS解决的题目

一.130  Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/) 题目: 解法: 这道题的意思是将所有被X包围的O都变为X(边缘的不算),我们可以维护一个队列,先把四周的O的位置放进队列中,并把这个位置的值变为Y.然后每次从队列中拿出一个位置,把这个位置四周为O的位置的值变为Y,再把这个位置放进队列(为什么要先变值再进队列呢?在下一道题中会说).一直到队列为空时,我们就成功地把所有直接

POJ 2049-Finding Nemo(三维bfs解决类迷宫问题)

Finding Nemo Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7902   Accepted: 1827 Description Nemo is a naughty boy. One day he went into the deep sea all by himself. Unfortunately, he became lost and couldn't find his way home. Therefo

BFS求解迷宫最短路径

本文使用BFS广度优先搜索算法实现求解迷宫的最短路径(C++),使用到了队列先进先出的性质,依次搜索路径直到找到目标出口(如果迷宫能走通)求解到的路径即为该迷宫的最短路径,找到返回true,找不到返回false,本文使用vexmap一个map容器记录队列的搜索路径(记录队列路径的实现有点草率,可以再优化).</p><p> </p><pre class="cpp" name="code">#include<iost

BFS简单迷宫

常见迷宫: 输入迷宫 启点 终点 然后求最短路径 BFS例题 用dist[][]数组来记录 启点到每个点的最短路径 1 #include <iostream> 2 #include <fstream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <queue> 6 using namespace std; 7 8 const int maxsize = 128; 9 const in

回溯法解决迷宫问题

现在有迷宫地图:(回溯法) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 将迷宫地图存于文件中,将文件里的信息依次读入到二维数组中,设置入口,先将