判断如果该方向上能走,(能走要是:不是以前走过的地方,不是墙壁,不是地图之外)就走这一步,然后记录下这一步。
如果不能走,就换下一个方向,如果能走就继续下一步。各个方向都不能走,说明到了死路,这时候就返回上一步去走下一个方向。如此继续。
每走动一步都要检测是不是到达目标了,如果到达就输出结果。
如果不能走到目标,返回到最除起点也不能走了,说明无解。
我的示意程序如下:
*/
/*地图路径求解程序,用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,关闭输出,同时清除高电平时刻
}
}
估计精度不怎么好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)