在一个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. python3爬取豆瓣排名前250电影信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : doubanmovie.py # @Author: Anthony.waa # @Dat ...

  2. 前端HTML中float学习笔记

    float元素原本的作用是用来使文字包裹图片,现在人们更多的是用来进行布局(ps:有没有点滥用的意思) 也就是说本来你排好的界面设计,但是因为浮动会导致元素脱离文档流,使得其他非浮动的块级元素会无视这 ...

  3. 实例化vue发生了什么(详解vue生命周期)

    const app = new Vue({ el:"#app', data:{ message:'hello,lifePeriod' }, methods:{ init(){ console ...

  4. js实现“级联菜单”

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. mysql主从不同步,提示更新找不到记录

    查看丛库状态show slave status\G 从库原文提示:Last_Error: Coordinator stopped because there were error(s) in the ...

  6. 【Linux】连接CRT

    linux中出现crt连接不上多数是ip地址设置不正确. window中命令行界面(cmd进入),输入ipconfig,查看虚拟机的ip. 打开linux终端,命令行下输入:ifconfig eth0 ...

  7. Eclipse Rap开发 异步刷新UI处理

    1.Display.getCurrent()获取的是当前线程的display对象,如果当前在非UI线程中那么获取到的display对象为空:      一般Display.getCurrent() 用 ...

  8. Windows-Server-2008、IIS7.0环境下配置伪静态化

    在Windows-Server-2008.IIS7.0环境下配置伪静态化                首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为 ...

  9. Model2

    Model1: Model2:

  10. 进行https通信时服务器端下发的是一个证书链

    进行https通信时服务器端下发的是一个证书链,否则无法验证证书的有效性.