总结:这个是网上找的,下面一个是我在他基础上修改的。
/* 二. 栈的应用-迷宫解题 */ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //坐标类型 typedef struct { int x; int y; }Postype; //栈的元素类型 typedef struct { int x; int y; }ElemType; //二维数组,存储迷宫 int MAP[9][9] = { 0,0,0,0,0,0,0,0,0, 0,1,0,0,1,1,1,1,0, 0,1,0,0,1,1,1,1,0, 0,1,1,1,1,0,1,1,0, 0,1,0,1,0,1,1,1,0, 0,1,0,1,0,1,1,1,0, 0,1,0,1,0,1,1,1,0, 0,0,0,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0, }; /*-------------------------------------栈的元素类型定义完毕-------------------------*/ typedef int Status; //函数返回值 #define STACK_INIT_SIZE 5 // 栈的初始大小 #define STACK_INCREMENT 10 // 每次增加的空间大小 //下面给出栈的相关定义 typedef struct { ElemType *base; //在构造栈之前和销毁之后,base的值为NULL ElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }ZJC_Stack; //--------------------------------------栈基本操作的算法部分-------------------------- //栈的初始化 Status InitStack(ZJC_Stack &S) { S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //分配内存空间 if(!S.base){ exit(OVERFLOW); } else //否则分配成功 { S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } } //获得栈顶元素 ElemType GetTop(ZJC_Stack S) { if(S.top == S.base ) exit(ERROR); return *(S.top - 1); } //压栈 Status Push(ZJC_Stack &S,ElemType e) { if(S.top - S.base >= S.stacksize) { S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACK_INCREMENT; } *S.top++ = e; return OK; } void Print_Path(ZJC_Stack S) //打印出栈中的元素 { printf("\n寻路完成..路径坐标值如下:......\n"); ElemType *p = S.base; //首先p指向栈底指针 ElemType temp; while( p != S.top) //只要没有到顶端,指针就移动,然后输出元素值 { temp = *p; printf("\n路径 x = %d , y = %d",temp.x,temp.y); p++; } } //出栈函数 Status Pop(ZJC_Stack &S,ElemType &e) { if(S.top == S.base ) //空栈,返回错误 return ERROR; else //不是空栈 { e = * --S.top; return OK; } } void PathAddToStack(int i,int j,ElemType temp,ZJC_Stack &robot) //因为要修改值,所以取地址,开始没加取地址符号,栈顶元素一直是(1,1) { temp.x = i,temp.y = j; Push(robot,temp); MAP[i][j] = 2; //标记已经走过该格子了,当初想是否需要用其他标记,实际上不需要的,既然标记2,那么证明当然可以走过(不是墙)! } void MAZH_SOLVE(int endx,int endy) //解决迷宫问题函数,参数为终点的坐标 { int i = 1,j = 1; //起点坐标 ZJC_Stack robot; //定义栈; if(InitStack( robot ) ) //初始化栈 printf("\n栈的初始化完成....\n"); ElemType CurrentPos ; //当前位置 ElemType start; //初始位置的相关信息 ElemType temp; //暂时用的 start.x = i; start.y = j; temp = start; MAP[i][j] = 2; //走过的标记为2 Push(robot,start); //初始位置入栈 printf("\n开始寻路....\n"); do //主要寻路算法: { CurrentPos = GetTop(robot); i = CurrentPos.x; j = CurrentPos.y; printf(" \n寻路过程如下栈顶元素的 x = %d ,y = %d....\n",i,j); if(MAP[i][j+1] == 1) //表明向下一格走得通 { printf("\n向下能走动"); //向下前进一步,压栈,标记 j++; PathAddToStack(i,j,temp,robot); } else if( MAP[i + 1][j] == 1) { printf("\n向右能走动"); i++; PathAddToStack(i,j,temp,robot); } else if(MAP[i - 1][j] == 1) { printf("\n向左能走动"); i--; PathAddToStack(i,j,temp,robot); } else if(MAP[i][j - 1] == 1) { printf("\n向上能走动"); j--; PathAddToStack(i,j,temp,robot); } else //都走不动 { printf("\n都走不动,退栈"); Pop(robot,temp); } }while( GetTop(robot).x != endx || GetTop(robot).y != endy); //只要栈顶元素的x,y不等于终点坐标的x,y,则一直循环找路径 printf("\n完成!\n"); Print_Path(robot); //打印出坐标值 } int main() //入口函数 { MAZH_SOLVE(7,7); return 0; }
/* 二. 栈的应用-迷宫解题 */ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //坐标类型 typedef struct { int x; int y; }Postype; //栈的元素类型 typedef struct { int x; int y; }ElemType; //二维数组,存储迷宫 int MAP[7][7] = { 1,0,0,1,1,1,1, 1,0,0,1,1,1,1, 1,1,1,1,0,1,1, 1,0,1,0,1,1,1, 1,0,1,0,1,1,1, 1,0,1,0,1,1,1, 0,0,1,1,1,1,1, }; /*-------------------------------------栈的元素类型定义完毕-------------------------*/ typedef int Status; //函数返回值 #define STACK_INIT_SIZE 5 // 栈的初始大小 #define STACK_INCREMENT 10 // 每次增加的空间大小 //下面给出栈的相关定义 typedef struct { ElemType *base; //在构造栈之前和销毁之后,base的值为NULL ElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }ZJC_Stack; //--------------------------------------栈基本操作的算法部分-------------------------- //栈的初始化 Status InitStack(ZJC_Stack &S) { S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //分配内存空间 if(!S.base){ exit(OVERFLOW); } else //否则分配成功 { S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } } //获得栈顶元素 ElemType GetTop(ZJC_Stack S) { if(S.top == S.base ) exit(ERROR); return *(S.top - 1); } //压栈 Status Push(ZJC_Stack &S,ElemType e) { if(S.top - S.base >= S.stacksize) { S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACK_INCREMENT; } *S.top++ = e; return OK; } void Print_Path(ZJC_Stack S) //打印出栈中的元素 { printf("\n寻路完成..路径坐标值如下:......\n"); ElemType *p = S.base; //首先p指向栈底指针 ElemType temp; while( p != S.top) //只要没有到顶端,指针就移动,然后输出元素值 { temp = *p; printf("\n路径 x = %d , y = %d",temp.x,temp.y); p++; } } //出栈函数 Status Pop(ZJC_Stack &S,ElemType &e) { if(S.top == S.base ) //空栈,返回错误 return ERROR; else //不是空栈 { e = * --S.top; return OK; } } void PathAddToStack(int i,int j,ElemType temp,ZJC_Stack &robot) //因为要修改值,所以取地址,开始没加取地址符号,栈顶元素一直是(1,1) { temp.x = i,temp.y = j; Push(robot,temp); MAP[i][j] = 2; //标记已经走过该格子了,当初想是否需要用其他标记,实际上不需要的,既然标记2,那么证明当然可以走过(不是墙)! } void MAZH_SOLVE(int endx,int endy) //解决迷宫问题函数,参数为终点的坐标 { int i = 0,j = 0; //起点坐标 ZJC_Stack robot; //定义栈; if(InitStack( robot ) ) //初始化栈 printf("\n栈的初始化完成....\n"); ElemType CurrentPos ; //当前位置 ElemType start; //初始位置的相关信息 ElemType temp; //暂时用的 start.x = i; start.y = j; temp = start; MAP[i][j] = 2; //走过的标记为2 Push(robot,start); //初始位置入栈 printf("\n开始寻路....\n"); do //主要寻路算法: { CurrentPos = GetTop(robot); i = CurrentPos.x; j = CurrentPos.y; printf(" \n寻路过程如下栈顶元素的 x = %d ,y = %d....\n",i,j); if(MAP[i][j+1] && MAP[i][j+1] == 1) //表明向下一格走得通 { printf("\n向下能走动"); //向下前进一步,压栈,标记 j++; PathAddToStack(i,j,temp,robot); } else if( MAP[i + 1][j] && MAP[i + 1][j] == 1) { printf("\n向右能走动"); i++; PathAddToStack(i,j,temp,robot); } else if(MAP[i - 1][j] && MAP[i - 1][j] == 1) { printf("\n向左能走动"); i--; PathAddToStack(i,j,temp,robot); } else if(MAP[i][j - 1] && MAP[i][j - 1] == 1) { printf("\n向上能走动"); j--; PathAddToStack(i,j,temp,robot); } else //都走不动 { printf("\n都走不动,退栈"); Pop(robot,temp); } }while( GetTop(robot).x != endx || GetTop(robot).y != endy); //只要栈顶元素的x,y不等于终点坐标的x,y,则一直循环找路径 printf("\n完成!\n"); Print_Path(robot); //打印出坐标值 } int main() //入口函数 { MAZH_SOLVE(6,6); return 0; }
时间: 2024-12-07 20:25:02