根据书中的迷宫图,用栈的方法,用二维数组代表迷宫(1代表不通,0代表通,2代表出口)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Point{
int x;
int y;
}Point;
typedef struct Info{
// int ord;
int di;
Point pi;
struct Info *next;
}Info;
Info *head=NULL;
void push(Info *h){
Info *p;
Info *s;
p=(Info *)malloc(sizeof(Info));
*p=*h;
if(head == NULL){
head=p;
head->next=NULL;
}
else p->next=head;
head=p;
}
void pop(Info *h){
if(head == NULL) return ;
Info *p;
p=head;
*h=*p;
head = head->next;
free(p);
}
bool Pass(int a[][10],Point *p,int *ord){
int i;
int j;
Info s;
i=p->x;
j=p->y;
switch(*ord){
case 1:{
if(a[i-1][j] == 1){
*ord=3;
return false;
}
else {
p->x=i-1;
return true;
}
}
case 2:{
if(a[i][j-1] == 1){
*ord=1;
return false;
}else {
p->y=j-1;
return true;
}
}
case 3:{
if(a[i][j+1] == 1) {
*ord=4;
return false;
}else {
p->y=j+1;
return true;
}
}
case 4:{
if(a[i+1][j] == 1){
*ord=2;
return false;
}else{
p->x=i+1;
return true;
}
}
}
return false;
}
void fun(int a[][10]){
int i,j;
for(i=0;i<10;i++){
a[i][0]=1;
a[0][i]=1;
}
for(i=0;i<10;i++){
a[i][9]=1;
a[9][i]=1;
}
a[1][3]=1;
a[2][3]=1;
a[1][7]=1;
a[2][7]=1;
a[3][5]=1;
a[3][6]=1;
a[6][2]=1;
a[6][6]=1;
a[5][4]=1;
a[8][1]=1;
for(i=2;i<8;i++){
if(i==5) continue;
a[7][i]=1;
}
for(i=2;i<5;i++)
a[4][i]=1;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main(int argc,char *argv[])
{
int a[10][10]={0};
int b=3;
int tmp=0;
Info s;
Point p;
p.x=1;
p.y=1;
a[8][8]=2; //迷宫出口
fun(a); //设置迷宫
while(1){
a[p.x][p.y]=1;
if(Pass(a,&p,&b) ) //判断下一步是否可通
{
tmp=0;
s.di=b;
s.pi.x=p.x;
s.pi.y=p.y;
push(&s); //压栈
if( a[p.x][p.y]== 2) break;
}
else{
tmp++;
if(tmp == 4) {
pop(&s); //出栈
b=5-s.di;
if(b == 4) p.x++;
else if(b == 3) p.y++;
else if(b == 2) p.y--;
else if(b == 1) p.x--;
tmp=0;
}
}
printf("x=%d,y=%d,dir=%d\n",p.x,p.y,b);
}
return 0;
}