1.定义栈的结构。
typedef struct
{
int x;
int y;
int c; //东北西南方向依次进行(逆时针方向)
}stack;
2.定义迷宫。
char maze[MAXC][MAXR]={{'1','1','1','1','1','1','1','1','1','1'},{'1','0','0','1','0','0','0','1','0','1'},{'1','0','0','1','0','0','0','1','0','1'},
{'1','0','0','0','0','1','1','0','0','1'},{'1','0','1','1','1','0','0','0','0','1'},{'1','0','0','0','1','0','0','0','0','1'},
{'1','0','1','0','0','0','1','0','0','1'},{'1','0','1','1','1','0','1','1','0','1'},{'1','1','0','0','0','0','0','0','0','1'},
{'1','1','1','1','1','1','1','1','1','1'}}; //10*10迷宫
3.判断各个方向是否可通,以东为例。
case 1: //东方向
{
if(maze[ep[i].x][ep[i].y+1]=='0')
{
i++;
ep[i].x=ep[i-1].x; //进栈
ep[i].y=ep[i-1].y+1;
maze[ep[i].x][ep[i].y]='2';
}
else
{
ep[i].c+=1;
}
4.若路径不符合,则退栈。
else
{
maze[ep[i].x][ep[i].y]='0'; //退栈
ep[i].c=1;
i--;
ep[i].c+=1;
if(i==0)
{
return;
}
}
5.判断是否到终点,到后输出路径。
if(ep[i].x==x_end&&ep[i].y==y_end)
{
for(int j=0;j<i;j++) //输出可通路径程序
{
maze[ep[j].x][ep[j].y]='*';
}
maze[8][8]='*';
for(int k=0;k<MAXC;k++)
{
for(int m=0;m<MAXR;m++)
{
printf("%c ",maze[k][m]);
}
printf("\n");
}
return;
}
6.运行结果。
7.全部代码。
#include "stdio.h"
#include "stdlib.h"
#define MAXC 10
#define MAXR 10
#define N 100
typedef struct
{
int x;
int y;
int c; //东北西南方向依次进行(逆时针方向)
}stack;
char maze[MAXC][MAXR]={{'1','1','1','1','1','1','1','1','1','1'},{'1','0','0','1','0','0','0','1','0','1'},{'1','0','0','1','0','0','0','1','0','1'},
{'1','0','0','0','0','1','1','0','0','1'},{'1','0','1','1','1','0','0','0','0','1'},{'1','0','0','0','1','0','0','0','0','1'},
{'1','0','1','0','0','0','1','0','0','1'},{'1','0','1','1','1','0','1','1','0','1'},{'1','1','0','0','0','0','0','0','0','1'},
{'1','1','1','1','1','1','1','1','1','1'}}; //10*10迷宫
void search(stack ep[N],int x_start,int y_start,int x_end,int y_end) //迷宫出口和入口(从0起计数)
{
int i=0;
ep[i].x=x_start;
ep[i].y=y_start;
maze[1][1]='2';
do
{
if(ep[i].c<5)
{
switch(ep[i].c)
{
case 1: //东方向
{
if(maze[ep[i].x][ep[i].y+1]=='0')
{
i++;
ep[i].x=ep[i-1].x; //进栈
ep[i].y=ep[i-1].y+1;
maze[ep[i].x][ep[i].y]='2';
}
else
{
ep[i].c+=1;
}
if(ep[i].x==x_end&&ep[i].y==y_end)
{
for(int j=0;j<i;j++) //输出可通路径程序
{
maze[ep[j].x][ep[j].y]='*';
}
maze[8][8]='*';
for(int k=0;k<MAXC;k++)
{
for(int m=0;m<MAXR;m++)
{
printf("%c ",maze[k][m]);
}
printf("\n");
}
return;
}
break;
}
case 2: //北方向
{
if(maze[ep[i].x-1][ep[i].y]=='0')
{
i++; //进栈
ep[i].x=ep[i-1].x-1;
ep[i].y=ep[i-1].y;
maze[ep[i].x][ep[i].y]=2;
}
else
{
ep[i].c+=1;
}
if(ep[i].x==x_end&&ep[i].y==y_end)
{
for(int j=0;j<i;j++) //输出可通路径程序
{
maze[ep[j].x][ep[j].y]='*';
}
maze[8][8]='*';
for(int k=0;k<MAXC;k++)
{
for(int m=0;m<MAXR;m++)
{
printf("%c ",maze[k][m]);
}
printf("\n");
}
return;
}
break;
}
case 3: //西方向
{
if(maze[ep[i].x][ep[i].y-1]=='0')
{
i++; //进栈
ep[i].x=ep[i-1].x;
ep[i].y=ep[i-1].y-1;
maze[ep[i].x][ep[i].y]='2';
}
else
{
ep[i].c+=1;
}
if(ep[i].x==x_end&&ep[i].y==y_end)
{
for(int j=0;j<i;j++) //输出可通路径程序
{
maze[ep[j].x][ep[j].y]='*';
}
maze[8][8]='*';
for(int k=0;k<MAXC;k++)
{
for(int m=0;m<MAXR;m++)
{
printf("%c ",maze[k][m]);
}
printf("\n");
}
return;
}
break;
}
case 4: //南方向
{
if(maze[ep[i].x+1][ep[i].y]=='0')
{
i++; //进栈
ep[i].x=ep[i-1].x+1;
ep[i].y=ep[i-1].y;
maze[ep[i].x][ep[i].y]='2';
}
else
{
ep[i].c+=1;
}
if(ep[i].x==x_end&&ep[i].y==y_end)
{
for(int j=0;j<i;j++) //输出可通路径程序
{
maze[ep[j].x][ep[j].y]='*';
}
maze[8][8]='*';
for(int k=0;k<MAXC;k++)
{
for(int m=0;m<MAXR;m++)
{
printf("%c ",maze[k][m]);
}
printf("\n");
}
return;
}
break;
}
}
}
else
{
maze[ep[i].x][ep[i].y]='0'; //退栈
ep[i].c=1;
i--;
ep[i].c+=1;
if(i==0)
{
return;
}
}
}while(1);
}
void main()
{
int x_start,y_start,x_end,y_end;
x_start=1; //迷宫入口(在矩阵中的)
y_start=1;
x_end=8;
y_end=8;
stack ep[N];
for(int j=0;j<N;j++)
{
ep[j].c=1;
}
search(ep,x_start,y_start,x_end,y_end);
}