在一个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. 使用MALTAB标定实践记录

    记录一下整个相机的标定矫正过程,希望能够帮助到刚学习标定的童鞋们- 首先下载matlab calibration toolbox,百度搜索第一条就是了(http://www.vision.caltec ...

  2. 设置浏览器让js报错

    ie-工具---internet选项--高级--“禁用脚本提示”前面那个框的勾去掉---“显示每个脚本错误的通知”给该项打勾 注意:此时是静态页面很容易提示出错误的行号,但是当js是动态页面的时候,浏 ...

  3. 171129-workaround on ubuntu-seting up piston for steem

    setup ubuntu environment variables sudo vi /etc/environment Then set all below variables: percentCha ...

  4. for 循环练习题(2)

    一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 var x=0.0001; for(var a=1;true;a++){ x=x*2; if (x>8848) { ...

  5. 【Linux】ubuntu中怪异的vi编辑器

    由于前几天一场windows系统的比特币勒索病毒,我下狠心装了Linux的ubuntu版本.可是今天在使用命令行中的vi编辑器时出现了怪异的现象:backspace不能删除,编辑模式回车随机出现字母. ...

  6. AI:IPPR的数学表示-CNN可视化语义分析

    前言: ANN是个语义黑箱的意思是没有通用明确的函数表示,参数化的模型并不能给出函数的形式,更进而不能表示函数的实际意义. 而CNN在图像处理方面具有天然的理论优势,而Conv层和Polling层,整 ...

  7. Combobox 下拉框赋值

    string sql = "select distinct RoleName from tb_Role"; DataTable dt = SqlHelper.DataTable(s ...

  8. php 加密解密函数封装

    算法一: //加密函数 function lock_url($txt,$key='yang') { $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi ...

  9. C# --MVC实现简单上传下载

    首先创建一个默认的控制器Defaultcontroller 然后生成视图View 在视图里面 创建文件选择器 创建上传.下载按钮 代码如下 <body> <div> <f ...

  10. React-Router ---withRouter

    import React from 'react' import { withRouter } from 'react-router' const Hello = (props) => { re ...