用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂)

#include<iostream> 
using namespace std;

void EnQueue(int i,int j,int k); //入队一个节点 
void DeQueue(int *i,int *j,int *k); //获取当前节点的序号和对应的迷宫坐标,然后出列 
bool GetNextPos(int *i ,int *j,int count); //得到下一个邻接点的位置 
void ShortestPath_BFS(int i,int j); //广度优先遍历寻找最短路径 
void ShortestPath(); //输出最短路径 
void Print(); //输出迷宫形状

int Map[10][10] = {{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,0},{1,1,1,1,1,1,1,1,1,1}};

struct Node 

int parent_id; //保存父节点的位置 
int node_id; //当前节点的序号,以便传递给孩子节点 
int x,y; //当前结点对应的坐标 
}Q[10*10]; //每个节点包含迷宫坐标、队列中的序号、父节点的序号,多个节点形成队列

int front = 0,rear = 0; //队列头指针和尾指针

void main() 

cout<<"程序说明:"<<‘\n‘<<"1.输出路径为最短路径;"<<‘\n‘<<"2.默认的出口在最右下角,如有需要可以调整。"<<‘\n‘<<‘\n‘; 
cout<<"初始地图如下:"<<endl; 
Print(); 
int i,j;

reinput: cout<<"请输入起点坐标(x,y): "<<endl; cin>>i>>j;

if(Map[i][j]) 
{
cout<<"不能从该处出发,请重新输入!"<<endl;goto reinput;

ShortestPath_BFS(i,j); cout<<"最短路径之一如下:"<<endl;
ShortestPath(); 
}

void EnQueue(int i,int j,int k) //入队一个节点

Q[rear].x = i; 
Q[rear].y = j; //保存当前节点对应的坐标位置
Q[rear].parent_id = k; //保存父节点的序号 ************-1
Q[rear].node_id = rear; //保存当前节点序号 
rear++;
}

void DeQueue(int *i,int *j,int *k) //获取当前节点的序号和对应的迷宫坐标,然后出列
{
*i = Q[front].x; 
*j = Q[front].y; 
*k = Q[front].node_id; 
front++; //出列一个节点
}

bool GetNextPos(int *i ,int *j,int count) //得到下一个邻接点的位置 
{
switch(count) 
{
case 1:(*j)++; return 1; //右
case 2:(*i)++; return 1; //下
case 3:(*j)--; return 1; //左
case 4:(*i)--; return 1; //上
default: 
return 0; 

}

void ShortestPath_BFS(int i ,int j) //广度优先遍历寻找最短路径 
{
int count,m,n,k; 
EnQueue(i,j,-1); 
Map[i][j] = 1; //起点入队,标记起点已走过
while(true)
{
count = 1; 
DeQueue(&i,&j,&k); 
n = i,m = j; 
//保存当前位置
while(GetNextPos(&i,&j,count)) 
{
count++; 
if(!Map[i][j]) 

EnQueue(i,j,k); 
Map[i][j] = 1; 
if(i == 8 && j == 9) 
return; //到达终点(8,9)是默认终点,可以任意修改
}

i = n; j = m; //保证遍历当前坐标的所有相邻位置
}
}

}

void ShortestPath() 
{
int i,j,k,sum=0;
k = rear-1; 
while(k != -1) 
{
i = Q[k].x; 
j = Q[k].y;
Map[i][j] = 2; 
k = Q[k].parent_id; 
}
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl;

for(i = 0;i < 10;i++) 
{
cout<<i; 
for(j = 0;j < 10;j++)
{
if(Map[i][j]==2) 
{sum++; cout<<"□";} 
else 
cout<<"■"; 
}
cout<<endl; 
}

cout<<"最短路径长度:"<<sum<<endl; 
}

void Print() 
{
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl; 
for(int i = 0;i < 10;i++) 
{
cout<<i; 
for(int j = 0;j < 10;j++) 
{
if(Map[i][j]) 
cout<<"■"; 
else 
cout<<"□"; 
}
cout<<endl; 

}

时间: 2024-11-14 04:31:20

用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂)的相关文章

十九 二分搜索树的广度优先遍历

二分搜索树广度优先遍历的实现: /* * 二分搜索树的层序遍历(广度优先遍历),队列实现 * 广度优先遍历优势在于更快找到想要查询的元素,主要用于搜索策略,算法设计--最短路径(无权图) */ public void levelOrder(){ Queue<Node> q = new LinkedList<>(); q.add(root); while(!q.isEmpty()){ Node cur = q.remove(); System.out.println(cur.e);

树的深度优先遍历和广度优先遍历

1 import java.util.ArrayDeque; 2 3 public class BinaryTree { 4 static class TreeNode{ 5 int value; 6 TreeNode left; 7 TreeNode right; 8 9 public TreeNode(int value){ 10 this.value=value; 11 } 12 } 13 14 TreeNode root; 15 16 public BinaryTree(int[] ar

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

ybt 1252 广度优先搜索 走迷宫(二维、最小步数)

1252:走迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 7272     通过数: 3241 [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. [输入] 第一行是两个整数,R和C,代表迷宫的长和宽.( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫. 空地格子用‘.’表示,

走迷宫(深度优先遍历)

●问题描述: 给出一个矩阵,其中0表示通路,1表示墙壁,这样就形成了一个迷宫,要求编写算法求出其中路径. ●递归思路: 编写一个走迷宫函数,传入二位数组的下标,先假设该点位于最终路径上(将0置为3)再探测周围四个点是否可以走通(是否为0),如果可以走通则将该点四周能走通的点作为函数参数传入函数进入递归.若四周均不能走通(都不为0时)则将该点置回0表示该点不是最终路径上的点. 在此思路中递归进入时表示了枚举路径,当发现此条路径走到某处再不能走通时就将路径该点置回0并且递归退出(回溯)寻找下一条可走

golang 实现广度优先算法(走迷宫)

maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ func readMaze(filename string) [][]int { file, err := os.Open(filename) if err != nil { panic(err) } var cols, rows int fmt.Fscanf(file, "%d %d", &a

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图

回溯法找迷宫最短路径

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径 我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,解决办法如下: 从一点开始出发,向四个方向查找(上,右,下,左),每走一步,把走过的点的值+1,防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙.或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止. 如果我们调整查找的顺序,改为左.右.上.下,可能会得到更短的路径,但这种方法不能保证一定是最短路径. 经过网上

Sicily Maze(BFS计算迷宫最短路径)

      1000. Maze                       Time Limit: 1sec    Memory Limit:256MB Description Master Tang is kidnapped by a monster and put in a maze, and Mr. Sha wants to rescue him. The maze is an n*m matrix. There are two types rooms in the maze, 1 fo