#include <stdio.h> //定义全局的变量index:栈数组的下标,i:x坐标。j:y坐标。k:自定义变量,遍历输出栈路径时使用 static int index=0,i=1,j=1,k; //栈结构体,用于存储路径 struct STACK { char x;//x坐标 char y;//y char step;//1:右。2:下。3:左。4:上。 struct STACK * next;//指向下一个结点 }stack1[20],*H;//定义指向结构体的数组,以及H指针,用于指向栈顶 //检查当前路径是否存在与栈中,返回1表示已经存在,返回0表示不存在 char isExit(int index1,int i1,int j1) { int n; for(n=0;n<index;n++) { if(stack1[n].x==i1&&stack1[n].y==j1) { return 1; } } return 0; } //打印栈函数元素 void print(int index2) { if(index2>=0) { printf("x=%d,y=%d\n",stack1[index2].x,stack1[index2].y); } } //主函数入口 void main() { //定义的迷宫 char sp[10][10]={{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}}; //初始化第一个元素 stack1[index].x=i; stack1[index].y=j; stack1[index].step=1; stack1[index].next=NULL; //设置头指针 H=&stack1[index]; //不为出口则一直循环 while(H->x!=8||H->y!=8) { //当step大于4时表示超出,重设为1 if(H->step>4) H->step=1; //向右移动 while(stack1[index].step==1&&sp[i][j+1]==0) { index++; i=i; j=j+1; stack1[index].step=stack1[index-1].step; stack1[index].x=i; stack1[index].y=j; stack1[index].next=H; H=&stack1[index]; //如果下一步已经存在于栈中 if(isExit(index,i,j)==1) { //并且它的其他三面都是1(墙壁) //if(sp[i+1][j]==1&&sp[i][j-1]==1&&sp[i-1][j]==1) //{ //删除栈顶数据,step++,index-- H=H->next; stack1[index].next=NULL; index--; i=i; j=j-1; if(sp[i-1][j]==1&&sp[i+1][j]==1) { H=H->next; stack1[index].next=NULL; index--; i=i; j=j+1; H->step--; } H->step++; //} } } if(sp[i][j+1]==1) H->step++; //向下移动 while(stack1[index].step==2&&sp[i+1][j]==0) { index++; i=i+1; j=j; stack1[index].step=stack1[index-1].step; stack1[index].x=i; stack1[index].y=j; stack1[index].next=H; H=&stack1[index]; //如果下一步已经存在于栈中 if(isExit(index,i,j)==1) { //并且它的其他三面都是1(墙壁) //if(sp[i+1][j]==1&&sp[i][j-1]==1&&sp[i-1][j]==1) //{ //删除栈顶数据,step++,index-- H=H->next; stack1[index].next=NULL; index--; i=i-1; j=j; H->step++; //} } } if(sp[i+1][j]==1) H->step++; //项左移动 while(stack1[index].step==3&&sp[i][j-1]==0) { index++; i=i; j=j-1; stack1[index].step=stack1[index-1].step; stack1[index].x=i; stack1[index].y=j; stack1[index].next=H; H=&stack1[index]; //如果下一步已经存在于栈中 if(isExit(index,i,j)==1) { //并且它的其他三面都是1(墙壁) // if(sp[i+1][j]==1&&sp[i][j-1]==1&&sp[i-1][j]==1) //{ //删除栈顶数据,step++,index-- H=H->next; stack1[index].next=NULL; index--; i=i; j=j+1; H->step++; // } } } if(sp[i][j-1]==1) H->step++; //向上移动 while(stack1[index].step>=4&&sp[i-1][j]==0&&sp[i][j+1]==1&&sp[i][j-1]==1) { if(sp[i+1][j]==1||sp[i+1][j]==0) { index++; i=i-1; j=j; stack1[index].step=stack1[index-1].step; stack1[index].next=H; H=&stack1[index]; //如果下一步已经存在于栈中 if(isExit(index,i,j)==1) { //并且它的其他三面都是1(墙壁) //if(sp[i+1][j]==1&&sp[i][j-1]==1&&sp[i-1][j]==1) //{ //删除栈顶数据,step++,index-- H=H->next; stack1[index].next=NULL; index--; i=i+1; j=j; H=H->next; stack1[index].next=NULL; index--; i=i-1; j=j; H->step++; //} } } } H->step++; }//end while //输出迷宫,起点为(1,1)终点为(8,8) for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%d\t",sp[i][j]); } printf("\n"); } //遍历输出路径 for(k=0;k<index+1;k++) { print(k); } }//end main
栈---数组---迷宫求解
最新推荐文章于 2021-11-20 20:55:34 发布