读书的时候总听说什么迷宫问题(c版本),当时只是云里雾里。听大家说队列能够解决问题。就也跟着说队列能够解决问题。现在实施起来,还是有点麻烦的。参考了清华大学c习题与解析中的一程序:
#include
<
stdio.h
>
#define M 5
#define N 5
struct stype /**/ /* 队列用来存储所访问过的点 */
... {
int x, y, pre;
} sq[ 49 ];
void printmglj( int rear); /**/ /* 函数声明 */
int mg[M + 2 ][M + 2 ] = /**/ /* 初始化迷宫图形 */
... {
...{1,1,1,1,1,1,1},
...{1,0,0,1,1,1,1},
...{1,1,0,0,1,0,1},
...{1,0,1,0,0,0,1},
...{1,0,1,1,0,1,1},
...{1,1,1,1,0,0,1},
...{1,1,1,1,1,1,1},
} ;
int zx[ 4 ],zy[ 4 ];
void init() /**/ /* 打印出迷宫图形 */
... {
int i, j;
int k = 0;
for(i = 0; i <= M+1; i++)
for(j = 0; j <= M+1; j++)
...{
k++;
printf("%3d",mg[i][j]);
if(k%7 == 0)
printf(" ");
}
zx[0] = -1; zx[1] = 0; zx[2] = 1; zx[3] = 0; /**//* 设立方向(不包括斜四角)*/
zy[0] = 0; zy[1] = 1; zy[2] = 0; zy[3] = -1;
}
void printmglj( int rear) /**/ /* 输出迷宫路径 */
... {
int i;
i = rear;
do
...{
printf("(%d,%d) ",sq[i].x,sq[i].y);
i = sq[i].pre;
}while(i != 0);
}
void mglj()
... {
int i, j; /**//*结点坐标*/
int x, y; /**//*存储的结点坐标*/
int v; /**//*移动方向*/
int front, rear; /**//*存储队列*/
int find; /**//*是否找到出路*/
sq[1].x = 1;
sq[1].y = 1;
sq[1].pre = 0;
find = 0;
front = 1; rear = 1; mg[1][1] = -1;
while((front <= rear) && (!find))
...{
x = sq[front].x;
y = sq[front].y;
for(v = 0; v <4; v++)
...{
i = x+zx[v];
j = y+zy[v];
if(mg[i][j] == 0)
...{
rear++;
sq[rear].x = i;
sq[rear].y = j;
sq[rear].pre = front;
mg[i][j] = -1;
}
if(i == M && j == N) /**//* 能够正常走出 */
...{
printmglj(rear);
find = 1;
}
}
front++;
}
if(!find)
printf("不存在路径! ");
}
void main()
... {
init();
mglj();
getch();
}
#define M 5
#define N 5
struct stype /**/ /* 队列用来存储所访问过的点 */
... {
int x, y, pre;
} sq[ 49 ];
void printmglj( int rear); /**/ /* 函数声明 */
int mg[M + 2 ][M + 2 ] = /**/ /* 初始化迷宫图形 */
... {
...{1,1,1,1,1,1,1},
...{1,0,0,1,1,1,1},
...{1,1,0,0,1,0,1},
...{1,0,1,0,0,0,1},
...{1,0,1,1,0,1,1},
...{1,1,1,1,0,0,1},
...{1,1,1,1,1,1,1},
} ;
int zx[ 4 ],zy[ 4 ];
void init() /**/ /* 打印出迷宫图形 */
... {
int i, j;
int k = 0;
for(i = 0; i <= M+1; i++)
for(j = 0; j <= M+1; j++)
...{
k++;
printf("%3d",mg[i][j]);
if(k%7 == 0)
printf(" ");
}
zx[0] = -1; zx[1] = 0; zx[2] = 1; zx[3] = 0; /**//* 设立方向(不包括斜四角)*/
zy[0] = 0; zy[1] = 1; zy[2] = 0; zy[3] = -1;
}
void printmglj( int rear) /**/ /* 输出迷宫路径 */
... {
int i;
i = rear;
do
...{
printf("(%d,%d) ",sq[i].x,sq[i].y);
i = sq[i].pre;
}while(i != 0);
}
void mglj()
... {
int i, j; /**//*结点坐标*/
int x, y; /**//*存储的结点坐标*/
int v; /**//*移动方向*/
int front, rear; /**//*存储队列*/
int find; /**//*是否找到出路*/
sq[1].x = 1;
sq[1].y = 1;
sq[1].pre = 0;
find = 0;
front = 1; rear = 1; mg[1][1] = -1;
while((front <= rear) && (!find))
...{
x = sq[front].x;
y = sq[front].y;
for(v = 0; v <4; v++)
...{
i = x+zx[v];
j = y+zy[v];
if(mg[i][j] == 0)
...{
rear++;
sq[rear].x = i;
sq[rear].y = j;
sq[rear].pre = front;
mg[i][j] = -1;
}
if(i == M && j == N) /**//* 能够正常走出 */
...{
printmglj(rear);
find = 1;
}
}
front++;
}
if(!find)
printf("不存在路径! ");
}
void main()
... {
init();
mglj();
getch();
}
经过WIN-TC测试。