迷宫-广度搜索

#include <iostream>
#include <string>
using namespace std;

const int N=100;
const int M=100;

typedef struct //定义迷宫结构
{
char c; short int p_row,p_col,step;
}Maze;
Maze a[N][M];

bool pathed[N][M]; //留下足迹数组
short int p[4][2]={-1,0,0,1,1,0,0,-1};//行走方向数组
int n,m;//行列变量
int bfs(int,int);

typedef struct //定义队列结构
{
int row,col,step;
} queue_type;
queue_type queue[N*M];

void bfs(int n,int m,int b_i,int b_j,int e_i,int e_j)
{
memset(pathed,0,sizeof(pathed));//足迹数组赋初始值

int row,col,start=0,end=1,;//队列的初始位置
queue[start].row=b_i, queue[start].col=b_j, queue[start].step=a[b_i][b_j].step=0; //开始位置入队列
pathed[b_i][b_j]=1; //留下足迹

while(start<end)
{
for(int i=0;i<4;i++)
{
row=queue[start].row+p[i][0],col=queue[start].col+p[i][1];
if(row>=0 && row<n && col>=0 && col<m && pathed[row][col]==0 && a[row][col].c!=‘#‘)
{
pathed[row][col]=1; //留下足迹
queue[end].row=row,queue[end].col=col,queue[end].step=queue[start].step+1; //加到队列的尾部

a[row][col].step=queue[end].step; //写入步数
a[row][col].p_row=queue[start].row,a[row][col].p_col=queue[start].col; //记下父节点
end++;
if(row==e_i && col==e_j) //找到满足条件解,返回
return;
}
}
start++;
}
}

void out_path(int b_i,int b_j,int e_i,int e_j)
{
if(e_i==b_i && e_j==b_j)
{printf("(%d,%d)",b_i,b_j); return ;}
else
out_path(b_i,b_j,a[e_i][e_j].p_row,a[e_i][e_j].p_col);
printf("-->(%d,%d)",e_i,e_j);
}

int main()
{
int i,j,n,m,b_row,b_col,e_row,e_col;
cout<<"请输入行、列值"<<endl;
cin>>n>>m;
cout<<"构造迷宫"<<endl;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ cin>>a[i][j].c; a[i][j].step=-1;}

cout<<"请输入开始点"<<endl;
cin>>b_row>>b_col;
cout<<"请输入结束点"<<endl;
cin>>e_row>>e_col;
bfs(n,m,b_row,b_col,e_row,e_col);
for(i=0;i<n;i++)
{
cout<<endl;
for(j=0;j<n;j++)
printf("%4d",a[i][j].step);
}
cout<<endl<<endl;
if(a[e_row][e_col].step==-1)
cout<<"No path!"<<endl;
else
{out_path(b_row,b_col,e_row,e_col);cout<<endl;}
}

迷宫-广度搜索,布布扣,bubuko.com

时间: 2024-10-13 17:50:29

迷宫-广度搜索的相关文章

迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现

本文针对迷宫问题,探讨解决思路并给出实现代码.在本文中,采用的图的深度优先搜索和广度优先搜索两种方法分别对迷宫的路径进行了求解. 首先来看迷宫问题的描述,可以参考此处,简而言之就是,通过一个二维数组(int型)来表示迷宫,迷宫中0表示可行,1表示不可行.在本文的实现中,可以输入给定迷宫,定义迷宫入口和出口,并查找迷宫路径. 总体的描述:在本文中,定义了结构体Node,用于存放节点信息,而Node内只有两个变量,标识节点的行坐标与列坐标.定义了迷宫类maze,并分别定义了相应的get.set函数,

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

八数码问题:C++广度搜索实现

毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限制又会有很多情况无法找到,然后果断放弃,改用广度搜索.  如果要改善代码效率还可以用双向搜索,即从起始状态和最终状态同时搜索,找到相同状态,这样搜索时间会缩短一半.此外还可以用A*(启发式算法)会显得高端很多. 题目要求: 在一个3*3的棋盘上,随机放置1到8的数字棋子,剩下一个空位.数字可以移动到

图的深度及广度搜索

今天来学习下,图的遍历方法,我们以下面这个图为例. 开始之前呢,先说个题外话,我们用最常用的二维数组来存这个图,专业的叫法是邻接矩阵法,这好像不是题外话吧!!^_^要不要先自己想一下,上面这个图用邻接矩阵怎么存呢! 废话不多说,先来个深度的吧: 那什么叫深度搜索呢:以一个未访问过的顶点(图由顶点和边组成,不要说你不知道哦!)为起点,沿着当前顶点边走到未访问过的顶点,当没有未访问过的顶点时,回到该顶点的上一个顶点,继续走到其未访问过的顶点,直到所有顶点都被访问过.对文字不太感冒?来看下面的incl

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

POJ 3984 迷宫问题 搜索题解

本题可以使用BFS和DFS解题,也可以构建图,然后利用Dijsktra解题. 不过因为数据很少,就没必要使用Dijsktra了. BFS和DFS效率都是一样的,因为都需要搜索所有可能的路径,并记录最短路径和当前路径. 推荐使用DFS,感觉会方便很多,BFS会麻烦很多,因为需要记录并比较路径. #include <stdio.h> #include <string.h> #include <limits.h> const int MAX_N = 5; const int

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

一步两步学算法之图的广度搜索

bfs利用队列搜索    详细看代码 #define VERTEX_MAX 26 //图的最大定点数 #define MAXVALUE 32767 //最大值 #include "stdio.h" #define QUEUE_MAXSIZE 10 //队列最大容量 typedef struct { char Vertex[VERTEX_MAX]; //保存定点信息的数组 int Edges[VERTEX_MAX][VERTEX_MAX]; //边的权 int IsTrav[VERTEX

poj3984 广度搜索BFS

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27072   Accepted: 15622 Description 定义一个二维数组: 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表示可以走的路,只能横着走或竖着走,不能斜着走