这是数据结构的作业,便找书边看网上,然后自己慢慢写出来的,这里面主要是回溯法。
因为课本上是打印出一条路径,然后我在想怎样能将所有的路径都输出来,方法:就是当求出一条路径后,将出口点变成可以走的点(因为之前将其值变成了-1),并且将栈顶元素出栈,还需要得到现在栈顶元素的i,j,di值,将其赋出来。
这里的思路是这样的,因为找最后一个点的时候是找倒数第二个点的上下左右四个方位,假设说是路径通畅的点是倒数第二个点的上面的点,当我们找另一条路径时,那么现在我们应该顺时针从次栈顶右面的点试探,查看是不是可行的点。
#include <stdio.h>
#define Max 9999
int mg[6][6] = {
{1,1,1,1,1,1},{1,0,0,0,1,1},
{1,0,1,0,0,1},{1,0,0,0,1,1},
{1,1,0,0,0,1},{1,1,1,1,1,1}
};
typedef struct {
int i;
int j;
int di;
}BOX;
typedef struct {
BOX data[Max];
int top;
}SqStack;
int InitSqStack(SqStack *s)
{
s->top = -1;
return 0;
}
int Destroy(SqStack *s)
{
free(s);
return 0;
}
int Push(SqStack *s, BOX *e)
{
if (s->top == Max - 1)
return 0;
s->top++;
s->data[s->top] = *e;
return 0;
}
int GetTop(SqStack *s, BOX *e)
{
if (s->top == -1)
return 1;
*e = s->data[s->top];
return 0;
}
int Pop(SqStack *s, BOX *e)
{
if (s->top == -1)
return 1;
*e = s->data[s->top];
s->top--;
return 0;
}
int Empty(SqStack *s)
{
if (s->top == -1)
return 1;
else
return 0;
}//1是空,0是非空。
int Man(SqStack *s)
{
if (s->top == Max - 1)
return 1;
else
return 0;
}
int zmg(int x, int y, int xe, int ye)
{
SqStack S;
BOX path[Max], e, E;
BOX shortpath[Max];
int di = 0, x1 = 0, y1 = 0, i = 0, j = 0;
int k = 0, fun = 0;
int m = 0, lm = 0, n = 0, op = 0;
int minlen = Max;
int js = 0, tp = 0;
InitSqStack(&S);//初始化栈
e.i = x;
e.j = y;
e.di = -1;
Push(&S, &e);
mg[x][y] = -1;
while (Empty(&S) != 1)//不等于空
{
GetTop(&S, &e);
i = e.i;
j = e.j;
di = e.di;
if (i == xe && j == ye)
{
k = 0;
tp = S.top;
for (js = 0;js <= tp;js++)
{
S.top = js;
printf("\t(%d,%d)", S.data[S.top].i, S.data[S.top].j);
shortpath[n] = path[op];
}
printf("\n");
if (tp + 1 < minlen)
{
for (S.top = 0,n = 0;n <=tp;n++,S.top++)
{
shortpath[n] = S.data[S.top];
}
S.top = tp;
minlen = tp + 1;
}
mg[i][j] = 0;
Pop(&S, &e);
GetTop(&S, &e);
i = e.i;
j = e.j;
di = e.di;
}
fun = 0;
while (di < 4 && fun != 1)
{
di++;
switch (di)
{
case 0:
x1 = i - 1;
y1 = j;
break;
case 1:
x1 = i;
y1 = j + 1;
break;
case 2:
x1 = i + 1;
y1 = j;
break;
case 3:
x1 = i;
y1 = j - 1;
break;
}
if (mg[x1][y1] == 0)
fun = 1;
}
if (fun == 1)
{
S.data[S.top].di = di;
e.i = x1;
e.j = y1;
e.di = -1;
Push(&S, &e);
mg[x1][y1] = -1;
}
else
{
Pop(&S, &e);
mg[e.i][e.j] = 0;
}
}
printf("\n");
printf("最短路径的长度%d,M:",minlen);
for(n=0;n<minlen;n++)
{
printf("\t(%d,%d)",shortpath[n].i,shortpath[n].j);
}
Destroy(&S);
return 0;
}
int main()
{
printf("迷宫所有路径如下:\n");
zmg(1, 1, 4, 4);
return 0;
}