关于计算机C++编程的迷宫问题的解题思路?

关于计算机C++编程的迷宫问题的解题思路?,第1张

/*走通用迷宫问题的思路是:从给定的任意一个起点开始,向各个方向都有走动的可能,按照一定的顺序进行。

判断如果该方向上能走,(能走要是:不是以前走过的地方,不是墙壁,不是地图之外)就走这一步,然后记录下这一步。

如果不能走,就换下一个方向,如果能走就继续下一步。各个方向都不能走,说明到了死路,这时候就返回上一步去走下一个方向。如此继续。

每走动一步都要检测是不是到达目标了,如果到达就输出结果。

如果不能走到目标,返回到最除起点也不能走了,说明无解。

我的示意程序如下:

*/

/*地图路径求解程序,用VC++编写的,*/

#include<stdio.h>

#include<stdlib.h>

#define

ROW

9/*定义行数*/

#define

COL

13/*定义列数*/

typedef

struct

RowAndColPath{

int

r

int

c

}RowAndColPath/*定义结构体实现走步过程的记录*/

int

Move[4][2]={{0,1},{1,0},{-1,0},{0,-1}}/*4个方向*/

RowAndColPath

path[ROW*COL]/*走动过程的记录*/

bool

ResultFlag=false/*找到解的标志*/

bool

GettingPath(int

step,int

CurrentRow,int

CurrentCol,int

ResultRow,int

ResultCol,int

MapWay[][COL])/*递归求解方法*/

void

main()

{

int

MapWay[ROW][COL]={

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

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

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

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

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

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

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

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

{1,1,1,0,0,0,1,1,1,1,1,1,1}}/*定义地图*/

int

CurrentRow=1,CurrentCol=0,ResultRow=0,ResultCol=8/*定义初始和结束位置*/

path[0].r=CurrentRow

path[0].c=CurrentCol/*初始位置进入历史的第一步*/

if(GettingPath(1,CurrentRow,CurrentCol,ResultRow,ResultCol,MapWay))/*如果走动成功*/

printf("恭喜!查找成功!\n")

else

printf("抱歉,查找失败!\n")

}

bool

GettingPath(int

step,int

CurrentRow,int

CurrentCol,int

ResultRow,int

ResultCol,int

MapWay[][COL])

{

int

i,j

for(i=0i<4i++)/*依次对4个方向搜索*/

{

if(ResultFlag)

return

true

CurrentRow+=Move[i][0]

CurrentCol+=Move[i][1]/*先按该方向前进一步*/

if((CurrentRow>=0)&&(CurrentRow<ROW)&&(CurrentCol>=0)&&(CurrentRow<COL))/*如果还在地图内部*/

{

if(MapWay[CurrentRow][CurrentCol]==0)/*下一步可以走*/

{

for(j=0j<stepj++)/*判断是不是重复了以前走过的路*/

{

if((path[j].r==CurrentRow)&&(path[j].c==CurrentCol))

break

}

if(j==step)/*如果没有走过这个点,就走*/

{

path[step].r=CurrentRow

path[step].c=CurrentCol/*计入该步*/

step++

if((CurrentRow==ResultRow)&&(CurrentCol==ResultCol))/*如果已到达目的地*/

{

ResultFlag=true

printf("路径如下:\n\n")

for(j=0j<stepj++)

printf("第

%d

步:\t%d\t%d\n",j,path[j].r,path[j].c)

return

true

}

else

{

if(step>=ROW*COL)/*如果已经走遍了地图,就宣布失败*/

return

0

if(!ResultFlag)

GettingPath(step,CurrentRow,CurrentCol,ResultRow,ResultCol,MapWay)/*没有到达目的,继续走*/

}

}

else/*如果已经走过这一点,退回去*/

{

CurrentRow-=Move[i][0]

CurrentCol-=Move[i][1]

}

}

else/*如果该点不可走,退回去*/

{

CurrentRow-=Move[i][0]

CurrentCol-=Move[i][1]

}

}

else/*如果该步出地图了,退回去*/

{

CurrentRow-=Move[i][0]

CurrentCol-=Move[i][1]

}

}

if(ResultFlag)

return

true

return

false/*无路可走*/

}

提供一种思路,程序没时间写。

1、PWM需要周期,因此定时器必须得设置匹配值,达到周期计数时间后复位TC值;

2、两个PWM波形需要产生可调的PWM,那么就需要让定时器知道什么时刻该让这个IO口输出高低电平。可以让两个输出提供参数,比如数值是多少后出现高电平,高电平持续多长数值?

3、最后就是关键点了,即将定时器TC值(周期值)细化,比如我脉宽周期设定TC值是3000时候复位,那么我可以将这个定时器定时300时候出现一次中断,600时候中断一次,900时候出现一次中断,一次类推,这样就可以得到很多的时间片段,即标志位COUNT。

4、我希望IO口在周期内出现可调节脉宽那么可以实现了,比如COUNT==IO1的时候让其出现高电平,持续多长时间后出现低电平(中断里面完成);

简单的示意程序:

void TIMER_HANDLE(void)

{

//判断是否达到TC值,如果达到则复位(COUNT清零),否则执行匹配中断

//在原有基础上设置匹配值中断,匹配值 +=300;

COUNT++

if((COUNT == IO1_H_TIME)) //现在正好是需要高电平的时刻,因此值置高

{

//持续时间开启(自减),是否为0?

//不是0,那么继续输出高电平

//是0,关闭输出,同时清除高电平时刻

}

}

估计精度不怎么好。


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

原文地址: http://outofmemory.cn/yw/11431803.html

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

发表评论

登录后才能评论

评论列表(0条)

保存