数据结构的课程开始也有一段时间了,第一次实验作业中,有这样一道题:
大意是说给定两个数轴上的点M,N.限定M的移动方式有3种:
①:左移一步:即Mnew=M-1;
②:右移一步:即Mnew=M+1;
③:右跳一步:即Mnew=M*2;
问M最少移动几次可以到达N;
初次看题我没想到用哪种数据结构,自己学得慢…与老师无瓜.因为之前用栈做了前缀表达式的题,还
试了一个迷宫的题,发现它的结构很适合用回溯法,因为先进后出,只要弹出栈顶就回到上一步了。
于是我想这题可不可以按迷宫的做法来做,看上去也是寻找路径问题,并且还简化了许多。此时,我
还没明白的是栈的那种搜索其实是递归的,并且是dfs搜索,它可能找到解,但未必是最优解,方向就
偏了。苦苦挣扎了一夜,死在递归上,多亏有人点醒,我又去翻书看队列,不禁后悔思索题目时没有
往后翻翻书,因为当时我已经会写顺序,循环,链式的队列了,但还没有看书上例题。结果一看,队列
居然也可以用来解迷宫。了解到它是属于bfs搜索后,大致了解了一下bfs能求得的是最优解,对于求最
短路径很有用的时候,我才恍然大悟。仿照例程写出了题解:
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 100
typedef struct
{
int pos;
int pre;
}Box;
typedef Box ElementType;
typedef struct
{
Box data[Maxsize];
int front,rear;
}Queue;
Queue *CreateOrdQue()
{
Queue *qu;
qu=(Queue*)malloc(sizeof(Queue));
qu->front=qu->rear=-1;
return qu;
}
int isEmpty(Queue* q)
{
return (q->front==q->rear);
}
int EnQueue(Queue *q,ElementType e)
{
if(q->rear==Maxsize-1)//队满
return 0;
else{
q->rear++;