在一个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();
}


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

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

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  2. [LeetCode] BFS解决的题目

    一.130  Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/) 题目: 解法: 这道题 ...

  3. BFS实现迷宫问题

    BFS实现迷宫问题 问题描述,要求从起点走到终点,找出最短的距离,要避开障碍 输入描述,输入一个二维数组表示地图,其中等于10就是终点,等于-10就是起点,等于1就是障碍,等于0就是可以走的 代码: ...

  4. BFS 、DFS 解决迷宫入门问题

    问题 B: 逃离迷宫二 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 5[提交][状态][讨论版] 题目描述 王子深爱着公主.但是一天,公主被妖怪抓走了,并且被关到了迷宫. ...

  5. ACM:图BFS,迷宫

    称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一 ...

  6. 广度优先搜索(BFS)——迷宫的最短路径

    宽度优先搜索按照距开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. 宽度优先搜索介绍(一篇不错的文章). 题目描述: 给定一个大小为N*M的迷宫.迷宫有通道和墙 ...

  7. 【bfs】迷宫问题

    [题目描述] 定义一个二维数组: 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, }; 它表示一个迷 ...

  8. BFS求解迷宫的最短路径问题

    题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...

  9. leetcode-78-子集(用bfs解决)

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1] ...

随机推荐

  1. MarkDown流程图概要

    要素 流程元素定义: 名称=>类型: 显示名称 控制流程定义: 名称1([yes,no],right)->名称2 注意事项 流程元素定义在代码上部, 流程走向定义在代码下部 名称可以取中文 ...

  2. Spark2.0.2+Zeppelin0.6.2 环境搭建 初探

    0.抱怨与其他(此部分与标题没有太多联系): 首先一点想说的是版本问题,为什么标题我会写清楚版本号呢!原因就是版本不对真的很会坑人. 就在写这篇博客的同一天,我还写了另一篇,是 Hadoop2.7.3 ...

  3. C#之单列双列集合绑定数据

    ---恢复内容开始--- 1.单列集合绑定方式 davList.DataSource=new BindingList<类型名>(集合名); 2.双列集合绑定方式 BindingSource ...

  4. Jenkins自动化部署.net程序

    一.安装Jenkins 百度上一大堆就不做说明了. 二.构建.net前的准备 1.安装MSBUILD.EXE插件 1.1.进去jenkins->系统管理->插件管理 1.2.配置MSBUI ...

  5. Type inference

    Type inference refers to the automatic detection of the data type of an expression in a programming ...

  6. UNIX SOCKET编程简介

    1  .  Layered Model of Networking Socket  编程的层次模型如下图所示,   最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层 ...

  7. Git 从github克隆文件至本地

    学习阶段,同一个项目,如何保障家与公司的代码同步的问题,可以使用git克隆来解决 在家将项目提交到了GitHub上,现在来到公司,需要将GitHub上的项目克隆到本地,那么对于公司的电脑来说,同样需要 ...

  8. vue-router同路由地址切换无效解决

    本来还想写的,一搜就有现成的,算了: http://blog.csdn.net/peng_guan/article/details/59702699

  9. Day 22 面向对象编程

    面向对象基础 面向对象编程(抽象) 对象:特征和技能的结合体 面向对象编程:一个个对象进行交互 优点:扩展性非常强 缺点:逻辑非常复杂 类与对象 类(类别):一系列具有相同特征和技能的对象 现实世界中 ...

  10. 切割窗口url

    var keyWords=location.href.split("?")[1].split("&"); console.log(keyWords) f ...