您的位置:首页 > 编程语言 > C语言/C++

迷宫求解(C语言)

2008-06-27 13:18 211 查看

任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;



#include<stdio.h>

#include<stdlib.h>

#defineMAXNUM100/*栈中最大元素个数*/

#defineN11/*地图的第一维长度*/

typedefstruct{

intx;/*行下标*/

inty;/*列下标*/

intd;/*运动方向*/

}DataType;

structSeqStack{/*顺序栈类型定义*/

intt;/*指示栈顶位置*/

DataTypes[MAXNUM];

};

typedefstructSeqStack*PSeqStack;/*顺序栈类型的指针类型*/

PSeqStackpastack;/*pastack是指向顺序栈的一个指针变量*/

PSeqStackcreateEmptyStack_seq(void){

PSeqStackpastack;

pastack=(PSeqStack)malloc(sizeof(structSeqStack));

if(pastack==NULL)

printf("Outofspace!!/n");

else

pastack->t=-1;

returnpastack;

}

intisEmptyStack_seq(PSeqStackpastack){

returnpastack->t==-1;

}

/*在栈中压入一元素x*/

voidpush_seq(PSeqStackpastack,DataTypex){

if(pastack->t>=MAXNUM-1)

printf("Overflow!/n");

else{

pastack->t++;

pastack->s[pastack->t]=x;

}

}

/*删除栈顶元素*/

voidpop_seq(PSeqStackpastack){

if(pastack->t==-1)

printf("Underflow!/n");

else

pastack->t--;

}

/*当pastack所指的栈不为空栈时,求栈顶元素的值*/

DataTypetop_seq(PSeqStackpastack){

return(pastack->s[pastack->t]);

}

voidpushtostack(PSeqStackst,intx,inty,intd){

DataTypeelement;

element.x=x;

element.y=y;

element.d=d;

push_seq(st,element);

}

voidprintpath(PSeqStackst){

DataTypeelement;

printf("/n/nThepathis:/n");

while(!isEmptyStack_seq(st)){

element=top_seq(st);

pop_seq(st);

printf("/nthenodeis:line%darrange%d/n",element.x,element.y);/*打印路径上的每一点*/

}

}

/*迷宫maze[M]
中求从入口maze[x1][y1]到出口maze[x2][y2]的一条路径*/

/*其中1<=x1,x2<=M-2,1<=y1,y2<=N-2*/

voidmazePath(intmaze[]
,intdirection[][2],intx1,inty1,intx2,inty2){

inti,j,k,g,h;

PSeqStackst;

DataTypeelement;

st=createEmptyStack_seq();

maze[x1][y1]=2;/*从入口开始进入,作标记*/

pushtostack(st,x1,y1,-1);/*入口点进栈*/

while(!isEmptyStack_seq(st)){/*走不通时,一步步回退*/

element=top_seq(st);

pop_seq(st);

i=element.x;j=element.y;

for(k=element.d+1;k<=3;k++){/*依次试探每个方向*/

g=i+direction[k][0];h=j+direction[k][1];

if(g==x2&&h==y2&&maze[g][h]==0){/*走到出口点*/

printpath(st);/*打印路径*/

return;

}

if(maze[g][h]==0){/*走到没走过的点*/

maze[g][h]=2;/*作标记*/

pushtostack(st,i,j,k);/*进栈*/

i=g;j=h;k=-1;/*下一点转换成当前点*/

}

}

}

printf("/nThepathhasnotbeenfound./n");/*栈退完未找到路径*/

}

intmain(){

intdirection[][2]={0,1,1,0,0,-1,-1,0};

intmaze[][11]={

1,1,1,1,1,1,1,1,1,1,1,

1,0,1,0,0,1,1,1,0,0,1,

1,0,0,0,0,0,1,0,0,1,1,

1,0,1,1,1,0,0,0,1,1,1,

1,0,0,0,1,0,1,1,0,1,1,

1,1,0,0,1,0,1,1,0,0,1,

1,1,1,0,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,1,1,1

};

intx1,x2,y1,y2;

printf("/nfromwhere?(lineandarrange)");

printf("/ninputlineandarrange(line>1,arrange>1):");

scanf("%d%d",&x1,&y1);

printf("/nwheretoend?(lineandarrange)");

printf("/ninputlineandarrange(line<=6,arrange<=9):");

scanf("%d%d",&x2,&y2);

mazePath(maze,direction,x1,y1,x2,y2);

return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: