数据结构之迷宫

根据书中的迷宫图,用栈的方法,用二维数组代表迷宫(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值