用C++实现寻找迷宫里最短路线

用C++实现寻找迷宫里最短路线,第1张

你找 QQ为85141512 的QQ空间里有 ,那个是我的

我是公司的网,上不了QQ抱歉。

有什么疑问发到百度我的消息里

都是数据结构的问题

我找到了,贴过来:

#include<iostream.h>

#include <stdlib.h>

#include<iomanip.h>

#define STACK_INIT_SIZE 100 //初始栈大小

#define STACKINCREAMENT 10 //添加栈的长度

#define SIZE_OF_MAPH 20 //迷宫高度

#define SIZE_OF_MAPW 20 //迷宫长度

////////////////////////////////////////////////////////////////////////////////

// 结构体名称:MazeCell

// 功能:用来描述迷宫组成单元的信息

// 成员:Pass: 当Pass为1时,表示导通块;为0则表示障碍块;

// Footprint: 当 Footprint为1时,表示留下足迹,反之,表示未经此地。

////////////////////////////////////////////////////////////////////////////////

typedef struct

{

int Pass

bool Footprint

}MazeCell

////////////////////////////////////////////////////////////////////////////////

// 结构体名称:SElemType

// 功能: 此为栈的元素,用来表示当前位置,(栈用来描述当前路径)

// 成员: ord: 通道块的序号

// x : 当前位置的横坐标

// y : 当前位置的纵坐标

// di : 搜索方向 1向东,2向南,3向西,4向北

////////////////////////////////////////////////////////////////////////////////

typedef struct

{

int ord

int x

int y

int di

}SElemType

////////////////////////////////////////////////////////////////////////////////

// 结构体名称: SqTack

// 功能: 此为栈,用来记录当前路径

// 成员: *base 栈底指针,指向起点

// *top 栈顶指针,指向路径的末点

// stacksize 栈的容量

//////////////////////////////////////////模丛悄//////////////////////////////////////

typedef struct

{

SElemType *base

SElemType *top

int stacksize

}SqStack

//////////////////////////////////////////////////////////////////////////////郑孙//

// 结构体名称: Seat

// 功能: 用来记录迷宫坐标,此结构体为中间变量,纯粹为方便编程而建立

// 成员: x: 用来记录横坐标

// y: 用来记录纵坐标

////////////////////////////////////////////////////////////旦渣////////////////////

typedef struct

{

int x

int y

}Seat

////////////////////////////////////////////////////////////////////////////////

// 函数名称: InitStack

// 功能: 此函数用于初始化一个栈,即在类存中找一块大小为STACK_INIT_SIZE个栈

// 元素的空间,将其首址赋给栈底指针,此时栈顶指针与栈底指针重合。栈的容

// 量为 STACK_INIT_SIZE。 *** 作成功则函数返回1,若类存空间不足,函数返回

// 0,表示初始化失败。

// 函数参数: SqStack &S

// 函数返回值类型: bool

////////////////////////////////////////////////////////////////////////////////

bool InitStack(SqStack &S)

{

S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))

if(!S.base)

{

return 0

}

S.top=S.base

S.stacksize=STACK_INIT_SIZE

return 0

}

////////////////////////////////////////////////////////////////////////////////

// 函数名称: BuideMaze

// 功能: 此函数的功能是用于根据用户要求建立一个迷宫地图,将用户输入的整形数组

// 形状给迷宫数组

//

// 函数参数: MazeCell Map[SIZE_OF_MAP][SIZE_OF_MAP]

// Seat &start 起点坐标

// Seat &end 终点坐标

// 函数返回值类型: bool 建立成功则返回1,反之返回0。

////////////////////////////////////////////////////////////////////////////////

void BuideMaze(MazeCell Map[SIZE_OF_MAPH][SIZE_OF_MAPW],int ma[SIZE_OF_MAPH][SIZE_OF_MAPW])

{

for(int i=0i<SIZE_OF_MAPHi++)

{

for(int j=0j<SIZE_OF_MAPWj++)

{

Map[i][j].Pass=ma[i][j]

Map[i][j].Footprint=0

}

}

}

////////////////////////////////////////////////////////////////////////////////

// 函数名称: Pass

// 功能: 此函数用于判断当前点是否可通,如果可通则返回1,反之返回0。

// 所谓可通是指当前位置为导通块并且当前位置没有留下脚印。

// 函数参数: Seat curpos 当前块的坐标

// MazeCell Map[SIZE_OF_MAP][SIZE_OF_MAP] 迷宫地图

// 函数返回值类型: bool 若当前块可通则返回1,反之则返回0。

////////////////////////////////////////////////////////////////////////////////

bool Pass(Seat curpos,MazeCell Map[SIZE_OF_MAPH][SIZE_OF_MAPW])

{

if(Map[curpos.x][curpos.y].Pass==0)

{

return 0

}

else if(Map[curpos.x][curpos.y].Footprint==1)

{

return 0

}

else

{

return 1

}

}

////////////////////////////////////////////////////////////////////////////////

// 函数名称: FootPrint

// 功能: 此函数用于在当前路径下留下脚印。

// 函数参数: Seat curpos 当前坐标

// MazeCell Map[SIZE_OF_MAP][SIZE_OF_MAP] 迷宫地图

// 函数返回值类型: 无

////////////////////////////////////////////////////////////////////////////////

void FootPrint(Seat curpos,MazeCell Map[SIZE_OF_MAPH][SIZE_OF_MAPW])

{

Map[curpos.x][curpos.y].Footprint=1

}

bool Push(SqStack &S,SElemType e)//栈插入函数

{

if(S.top-S.base>=S.stacksize)

{

S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(SElemType))

if(!S.base)

{

return 0

}

S.top=S.base+S.stacksize

S.stacksize=S.stacksize+STACKINCREAMENT

}

*S.top++=e

return 1

}

bool Pop(SqStack &S,SElemType &e)//栈取出最上面的元素,将值给e

{

if(S.base==S.top)return false

S.top--

e=*S.top

return true

}

////////////////////////////////////////////////////////////////////////////////

// 函数名称: NextPos

// 功能: 此函数用于将坐标为x,y位置的di方向位置切换为当前位置。

// 函数参数: Seat curpos 当前坐标

// int di 方向

// int x,y 坐标

// 函数返回值类型: 无

////////////////////////////////////////////////////////////////////////////////

void NextPos(int x,int y,Seat &curpos,int di)

{

if(di==1)

{

curpos.y=y+1

curpos.x=x

}

else if(di==2)

{

curpos.x=x+1

curpos.y=y

}

else if(di==3)

{

curpos.y=y-1

curpos.x=x

}

else if(di==4)

{

curpos.x=x-1

curpos.y=y

}

}

///////////////////////////////////////////////////////////////////////////

// 函数名称: PutIn

// 功能: 向数组里输入元素

// 函数参数: int map[] 将得到的数组给map

// int Wei 迷宫的长度

// int Hig 迷宫的高度

// 函数返回值类型: 无

///////////////////////////////////////////////////////////////////////////

void PutIn(int map[],int &Wei,int &Hig)

{

int w,h

cout<<"如果您想输入的迷宫大于所规定的大小,您只需修改SIZE_OF_MAPH和SIZE_OF_MAP"<<endl

cout<<"请输入迷宫的长度(长度小于等于"<<SIZE_OF_MAPW-2<<"):"

cin>>w

cout<<"请输入迷宫的高度(高度小于等于"<<SIZE_OF_MAPW-2<<"):"

cin>>h

cout<<"1表示导通块;0表示障碍块"<<endl

Wei=w

Hig=h

for(int i=0i<SIZE_OF_MAPHi++)

for(int j=0j<SIZE_OF_MAPWj++)

*(map+i*SIZE_OF_MAPW+j)=0

for(int is=1is<h+1is++)

{

cout<<"请输入第"<<is<<"行:"

for(int js=1js<w+1js++)

{

int point

cin>>point

*(map+is*SIZE_OF_MAPW+js)=point

}

cout<<endl

}

}

///////////////////////////////////////////////////////////////////////////

// 函数名称: Display

// 功能: 用于显示栈中所有元素

// 函数参数: 无

// 函数返回值类型: 无

///////////////////////////////////////////////////////////////////////////

void Display(SqStack S)

{

int i=1

SElemType *p

p=S.base

cout<<"从base到top:"<<endl

cout<<"di搜索方向:di=1向东,di=2向南,di=3向西,di=4向北"<<endl

while(p!=S.top) //从base到top打印元素

{

cout<<"第"<<i<<"步: "

cout<<"("<<(*p).y

cout<<","<<(*p).x

cout<<","<<(*p).di<<")"<<endl

p++

i++

}

}

void DisplayMaze(int ma[SIZE_OF_MAPH][SIZE_OF_MAPW],int w,int h)

{

cout<<"迷宫为(1代表可以通过;0代表不可以通过): "<<endl

for(int i=0i<h+2i++)

{

for(int j=0j<w+2j++)

{

cout<<ma[i][j]<<" "

}

cout<<endl

}

cout<<endl

}

///////////////////////////////////////////////////////////////////////////

// 函数名称: MazePath

// 功能: 组织所有子函数,求解迷宫

// 函数参数: 无

// 函数返回值类型: int 迷宫有解则返回1,反之则返回0;

////////////////////////////////////////////////////////////////////////////

int MazePath(MazeCell Map[SIZE_OF_MAPH][SIZE_OF_MAPW],Seat start,Seat end)

{

SElemType e

SqStack S//定义一个栈

InitStack(S)//初始化栈

Seat curpos//定义当前位置

int curstep//计步器

curstep=1//计步器计1

curpos.x=start.x//

curpos.y=start.y//当前位置设为起点

cout<<"起点是:"<<start.y<<" "<<start.x<<endl

cout<<"终点是:"<<end.y<<" "<<end.x<<endl

///////////////////////////////////////////////////////////////////////////

//

// 下面的循环是求解迷宫的核心程序

////////////////////////////////////////////////////////////////////////////

do

{

if(Pass(curpos,Map)) //如果当前块可通,则进行如下 *** 作

{

FootPrint(curpos,Map)//留下脚印

e.ord=curstep//记下计步器

e.x=curpos.x//记下行数

e.y=curpos.y//记下列数

e.di=1//设一个方向为东方

Push(S,e)//压栈 *** 作,将当前位置纳入当前路径

if(curpos.x==end.x&&curpos.y==end.y) //如果当前块为终点,进行如下 *** 作

{ //

cout<<"ok!"//

Display(S)//调用显示栈的子程序显示结果

return 1//函数返回1

} //

else //如果当前位置不是终点,进行如下 *** 作

{ //

NextPos(curpos.x,curpos.y,curpos,1)//切换东方向的位置为当前位置

curstep++//计步器自增1

}

}//if

else

{

if(S.base!=S.top) //如果当前块不通,且栈不为空(说明还有解)

{

Pop(S,e)//将栈顶元素d出进行观察

while(e.di==4&&(S.top-S.base)) //如果栈顶元素四方均不通

{

Pop(S,e)//d出下一个栈顶元素进行观察

}//while

if(e.di<4) //如果栈顶元素还有其他方向没有走过

{ //

e.di++//切换下一个方向为当前方向

Push(S,e)//压入栈

NextPos(e.x,e.y,curpos,e.di)//切换下一个方向位置为当前位置

}//if

}//if

}//else

}while(S.base!=S.top)//只要栈不空则说明有解,重复循环

cout<<"没找到路径"<<endl

}

////////////////////////////////////////////////////////////////////////////////

// 函数名称: main

// 功能: 组织所有子函数,求解迷宫

// 函数参数: 无

// 函数返回值类型: bool 迷宫有解则返回1,反之则返回0;

//

////////////////////////////////////////////////////////////////////////////////

void main()

{

MazeCell Map[SIZE_OF_MAPH][SIZE_OF_MAPW]//定义一个迷宫数组

/*int migong[SIZE_OF_MAPH][SIZE_OF_MAPW]= {

{ 0,0,0,0,0,0,0,0,0,0},

{ 0,1,1,0,0,0,0,0,0,0}, //1

{ 0,0,1,1,1,0,1,1,1,0}, //2

{ 0,0,1,0,1,1,1,0,1,0}, //3

{ 0,0,1,0,0,0,0,0,1,0}, //4

{ 0,0,1,0,1,1,1,0,0,0}, //5

{ 0,0,1,1,1,0,1,1,1,0}, //6

{ 0,0,0,0,0,0,0,0,0,0},

}//以数组表示的迷宫*/

int w,h

int migong[SIZE_OF_MAPH][SIZE_OF_MAPW]

PutIn(migong[0],w,h)

BuideMaze(Map,migong)//调用建立迷宫的子函数

DisplayMaze(migong,w,h)//显示迷宫的形状

Seat start,end//定义当前位置,起点位置,终点位置的结构体

/*start.x=1//起点

start.y=1//

end.x=2//终点

end.y=2//*/

cout<<"起点横坐标:"

cin>>start.y

cout<<"起点纵坐标:"

cin>>start.x

cout<<"终点横坐标:"

cin>>end.y

cout<<"终点纵坐标:"

cin>>end.x

MazePath(Map,start,end)

}

程序大部分分成函数了,你只要把函数的功能弄清楚了,就差不多了

祝你成功!我当时弄了3天才写出来的

你是指把两个单片机旁厅的程序合起来,最后

烧录

到一块单片机上么?

如果是源启丛的话,C语雹樱言只要改下程序开始的引脚定义就好了。把重复的I/O口再重新定义一下就好了。

计步器软件推荐:

一、咕咚

咕咚是一款运动社交软件,可以帮助培养良好的运动习惯,从而获得健康的身体脊庆。咕咚还可以让你在健身的同时,认识好友,不断扩展人脉圈,让生活更加有趣。

二、悦跑圈

跑步就用【悦跑圈】,精准的数据记录工具、独有的跑者社交圈子,最好的跑者都在这里!只要崇尚健康、热爱跑步,这都有属于自己的空间。

三、春雨计步器

只要将手机随身携带,自动记录每日运动量。轻量实用,简单清新,记录每天行走步数,自动测量卡路里消耗,步行高低峰实时显示,登录后数据自动备份,好友竞赛。

四、乐动力

乐动力是一款能够记录运动量的健身软斗扒件,可以自动记录步行、跑步和所到之处。乐动力APP,可以知道自己每天的樱销握运动量,对自己身体的锻炼情况了如指掌。

五、动动

动动是一款卓越的运动健康APP,可以帮助自己实现减肥目标,管理健康数据!动动是运动健康管理类应用的领跑者,动动APP,可以成为私人健身教练。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12312519.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存