#include<stdio.h>
#include<stdlib.h>
char a[10][21]={
"####################",
"# # #",
"# # #",
"# # #",
"# ##########",
"# # # #",
"# # # #",
"# # #",
"# #",
"####################"
};
struct position{
int x;
int y;
};
struct stack{
struct position *data;
int top;
int maxSize;
};
struct stack *createStack(int maxsize){
struct stack *s;
s=(struct stack *)malloc(sizeof(struct stack));
s->data=(struct position *)malloc(sizeof(struct position)*maxsize);
s->top=-1;
s->maxSize=maxsize;
return s;
}
int isFull(struct stack *s){
return s->top==s->maxSize-1;
}
int isEmpty(struct stack *s){
return s->top==-1;
}
void push(struct stack *s,struct position ps){
if(isFull(s)){
printf("stack is full\n");
return;
}
s->data[++s->top].x=ps.x;
s->data[s->top].y=ps.y;
}
struct position pop(struct stack *s){
if(isEmpty(s)){
printf("stack is empty\n");
exit(-1);
}
return s->data[s->top--];
}
void getWay(struct stack *s,int i,int j){/*核心代码*/
struct position ps;
ps.x=i;
ps.y=j;
a[i][j]='+';
push(s,ps);
if(i==8&&j==18){/*如果i,j走到了这里,就到出口了,就可以打印输出地图了*/
printf("路径地图:\n");
for (int i = 0; i < 10; i ++)
printf("%s\n", a[i]);
exit(1);/*打印完路径后就可以直接退出了,不然后面的函数回退和退栈浪费开销*/
}
if(a[i][j+1]==' '){/*试着往右走*/
getWay(s,i,j+1);
}
if(a[i+1][j]==' '){/*向下走*/
getWay(s,i+1,j);
}
if(a[i][j-1]==' '){/*向左走*/
getWay(s,i,j-1);
}
if(a[i-1][j]==' '){/*向上走*/
getWay(s,i-1,j);
}
a[i][j]=' ';/*都走不通,就将该位置还原*/
pop(s);/*然后退栈一次*/
if(isEmpty(s)){/*如果最后栈空了,说明最初的位置也退了,就说明没路*/
printf("\nThere is no way.\n");
}
}
int main(){
struct stack *s;
int n=100;
s=createStack(n);
printf("原地图:\n");
for (int i = 0; i < 10; i ++)
printf("%s\n", a[i]);
getWay(s,1,1);
return 0;
}
换地图结果: