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

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

#include

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<

cout<

Print();

int i,j;

reinput: cout<>i>>j;

if(Map[i][j])

{

cout<

}

ShortestPath_BFS(i,j); cout<

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<

for(i = 0;i < 10;i++)

{

cout<

for(j = 0;j < 10;j++)

{

if(Map[i][j]==2)

{sum++; cout<

else

cout<

}

cout<

}

cout<

}

void Print()

{

cout<

for(int i = 0;i < 10;i++)

{

cout<

for(int j = 0;j < 10;j++)

{

if(Map[i][j])

cout<

else

cout<

}

cout<

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值