C/C++知识点之用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂)
小标 2018-11-13 来源 : 阅读 2477 评论 0

摘要:本文主要向大家介绍了C/C++知识点之用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之用c++实现走迷宫,最短路径、广度优先遍历、队列、看懂它,你就掌握了数据结构的几种最常用的算法(c语言也可以看得懂),通过具体的内容向大家展示,希望对大家学习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; 

}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 2
看完这篇文章有何感觉?已经有3人表态,33%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程