const int width = 10;
const int height = 10;
//地图
int maze[height][width]={
//0,1,2,3,4,5,6,7,8,9
{1,1,1,1,1,1,1,1,1,1},//0
{1,0,0,1,0,0,0,1,0,1},//1
{1,0,0,1,0,0,0,1,0,1},//2
{1,0,0,0,0,1,1,0,0,1},//3
{1,0,1,1,1,0,0,0,0,1},//4
{1,0,0,0,1,0,0,0,0,1},//5
{1,0,1,0,0,0,1,0,0,1},//6
{1,0,1,1,1,0,1,1,0,1},//7
{1,1,0,0,0,0,0,0,0,1},//8
{1,1,1,1,1,1,1,1,1,1},//9
};
//脚印
int foot[height][width]={0};
地图比较简单,一个二维数组表示,1表示有障碍,0表示畅通
另外在探索的过程中,还要标记已经走了的步子
路径的数据结构中,还要记录下当前路径的方向..此标记决定下一个搜索的方向
//如下所示
typedef struct {
PosType pos;
int di;
}ElemType;
这个也就是栈的元素类型
//坐标
typedef struct PosType
{
int x;
int y;
}PosType;
//这个结构体也就是一个地图了,说明宽度,高度
typedef struct
{
int **path;
int width;
int height;
}MazePath;
//全局的方便使用
MazePath mazepath = {(int **)maze,width,height};
//测试地图.传入入口,出口
int TestMazePath(PosType start , PosType end)
大致思路是
设当前位置的初值为入口位置
do{
if当前可以通过.
{
将当前位置入栈,
if(当前位置是出口位置)
{
结束
}
else
{
将当前位置的东面的置为新的当前位置
}
}
else//当前不能通过
{
if栈不空,且栈顶元素还有别的方向要搜索.
{
设 顺时针方向找到栈顶位置的下一方块 为当前方块
}
if栈不空,且栈顶元素的四周都搜索完了
{
弹出栈顶元素,重新测试新的栈顶位置.直到找到一个可通的,或是栈为空了.
}
}
}while(栈不空)
int TestMazePath(PosType start , PosType end)
{
PStack s;
InitStack(&s);
PosType curpos;
curpos.x = start.x;
curpos.y = start.y;
ElemType e={0};
do
{
//可以通过
if(Canpass(curpos))
{
//留下标记
MarkFoot(curpos);
e.pos = curpos;
e.di = RIGHT;
//入栈
Push(s,e);
//找到出口了
if(curpos.x==end.x && curpos.y==end.y)
{
_printffoot(s);
return TRUE;
}
//取下一个pos
curpos = NextPos(curpos,RIGHT);
}
//不能通过
else
{
if(!StackEmpty(s))
{
//出栈,取值
Pop(s,&e);
//这个点已搜索完了
if(e.di==UP && !StackEmpty(s))
{
//标记
MarkFoot(e.pos);
//出栈,取值
Pop(s,&e);
}
//还没搜完
if(e.di < 4)
{
//继续搜
e.di++;
Push(s,e);
curpos = NextPos(e.pos , e.di);
}
}
}
} while (!StackEmpty(s));
return FALSE;
}