堆栈的应用--迷宫求解程序
2007-10-21 00:47
288 查看
//均已调试通过,编译器为DEV C++
#include <stdio.h>
#define Stack_Size 100
//*******定义每个块类型**********
typedef struct{
int flag;
int zhangai;
int data;
int up,down,left,right;
}Block;
//***********定义栈类型****************
typedef struct {
int *top;
int *base;
int stacklength;
}SqStack,*Pstack;
//**************创建空堆栈******************
void InitStack(Pstack S)
{
S->base=(int *)malloc(Stack_Size*sizeof(int));
if(!S->base)
exit(1);
S->top=S->base;
S->stacklength=Stack_Size;
}
//****************取栈顶元素************************
void GetTop(Pstack S,int *e)
{
if(S->top==S->base)
exit(1);
*e=*(S->top-1);
}
//***************入栈***************
void Push(Pstack S,int e)
{
if(S->top-S->base>=Stack_Size)
exit(1);
*(S->top++)=e;
}
//**************出栈****************
void Pop(Pstack S,int *e)
{
if(S->top==S->base)
exit(1);
*e=*(--S->top);
}
//**************清空堆栈******************
void ClearStack(Pstack S)
{
S->top=S->base;
}
//*******************主函数****************
int main()
{
Pstack T;
InitStack(T);
Block K[10][10];
int x,y;
int e;
int i,j;
int n,m;
printf("please input mikong size:/n");
printf("n:");
scanf("%d",&n);
printf("m:");
scanf("%d",&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
K[i][j].flag=0;
K[i][j].zhangai=0;
K[i][j].data=i*(m+1)+j;
K[i][j].up=0;
K[i][j].down=0;
K[i][j].left=0;
K[i][j].right=0;
}
//***************设置障碍**********************
printf("please set zhangai:/n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("/nK[%d][%d].zhangai:/n",i,j);
scanf("%d",&K[i][j].zhangai);
}
//****************设置入口地址 ***************
printf("please set enter inaddress:/n");
int in1,in2;
printf("in1:");
scanf("%d",&in1);
printf("/ni2:");
scanf("%d",&in2);
//***************设置出口地址******************
printf("please set exit outaddress:/n");
int out1,out2;
printf("out1:");
scanf("%d",&out1);
printf("/nout2:");
scanf("%d",&out2);
Push(T,K[in1][in2].data);
K[in1][in2].flag=1;
//******************向四周寻找通路**************************
x=in1,y=in2;
while(1)
{
if(x==out1&&y==out2)
break;
if(K[x][y].up!=1&&(x-1)>=0&&K[x-1][y].zhangai==0&&K[x-1][y].flag==0)
{
K[x][y].up=1;
x=x-1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=1;
if(x==out1&&y==out2)
break; //跳出while循环
continue; //终止while循环
}
if(K[x][y].down!=1&&(x+1)<=n&&K[x+1][y].zhangai==0&&K[x+1][y].flag==0)
{
K[x][y].down=1;
x=x+1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=3;
if(x==out1&&y==out2)
break;
continue;
}
if(K[x][y].left!=1&&(y-1)>=0&&K[x][y-1].zhangai==0&&K[x][y-1].flag==0)
{
K[x][y].left=1;
y=y-1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=2;
if(x==out1&&y==out2)
break;
continue;
}
if(K[x][y].right!=1&&(y+1)<=m&&K[x][y+1].zhangai==0&&K[x][y+1].flag==0)
{
K[x][y].right=1;
y=y+1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=4;
if(x==out1&&y==out2)
break;
continue;
}
if(T->top==T->base)
break;
Pop(T,&K[x][y].data); //周围无通路,后退
if(e==1)
{
x=x+1;
y=y;
}
else if(e==2)
{
x=x;
y=y-1;
}
else if(e==3)
{
x=x-1;
y=y;
}
else if(e==4)
{
x=x;
y=y+1;
}
if(T->top==T->base)
printf("No road,/n");
else
{
Pstack G;
InitStack(G);
while(T->top!=T->base)
{
Pop(T,&e);
Push(G,e);
}
printf("the road is /n");
while(G->base!=G->top)
{
Pop(G,&K[x][y].data);
printf("%d",K[x][y].data);
}
}
}
return 0;
}
#include <stdio.h>
#define Stack_Size 100
//*******定义每个块类型**********
typedef struct{
int flag;
int zhangai;
int data;
int up,down,left,right;
}Block;
//***********定义栈类型****************
typedef struct {
int *top;
int *base;
int stacklength;
}SqStack,*Pstack;
//**************创建空堆栈******************
void InitStack(Pstack S)
{
S->base=(int *)malloc(Stack_Size*sizeof(int));
if(!S->base)
exit(1);
S->top=S->base;
S->stacklength=Stack_Size;
}
//****************取栈顶元素************************
void GetTop(Pstack S,int *e)
{
if(S->top==S->base)
exit(1);
*e=*(S->top-1);
}
//***************入栈***************
void Push(Pstack S,int e)
{
if(S->top-S->base>=Stack_Size)
exit(1);
*(S->top++)=e;
}
//**************出栈****************
void Pop(Pstack S,int *e)
{
if(S->top==S->base)
exit(1);
*e=*(--S->top);
}
//**************清空堆栈******************
void ClearStack(Pstack S)
{
S->top=S->base;
}
//*******************主函数****************
int main()
{
Pstack T;
InitStack(T);
Block K[10][10];
int x,y;
int e;
int i,j;
int n,m;
printf("please input mikong size:/n");
printf("n:");
scanf("%d",&n);
printf("m:");
scanf("%d",&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
K[i][j].flag=0;
K[i][j].zhangai=0;
K[i][j].data=i*(m+1)+j;
K[i][j].up=0;
K[i][j].down=0;
K[i][j].left=0;
K[i][j].right=0;
}
//***************设置障碍**********************
printf("please set zhangai:/n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("/nK[%d][%d].zhangai:/n",i,j);
scanf("%d",&K[i][j].zhangai);
}
//****************设置入口地址 ***************
printf("please set enter inaddress:/n");
int in1,in2;
printf("in1:");
scanf("%d",&in1);
printf("/ni2:");
scanf("%d",&in2);
//***************设置出口地址******************
printf("please set exit outaddress:/n");
int out1,out2;
printf("out1:");
scanf("%d",&out1);
printf("/nout2:");
scanf("%d",&out2);
Push(T,K[in1][in2].data);
K[in1][in2].flag=1;
//******************向四周寻找通路**************************
x=in1,y=in2;
while(1)
{
if(x==out1&&y==out2)
break;
if(K[x][y].up!=1&&(x-1)>=0&&K[x-1][y].zhangai==0&&K[x-1][y].flag==0)
{
K[x][y].up=1;
x=x-1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=1;
if(x==out1&&y==out2)
break; //跳出while循环
continue; //终止while循环
}
if(K[x][y].down!=1&&(x+1)<=n&&K[x+1][y].zhangai==0&&K[x+1][y].flag==0)
{
K[x][y].down=1;
x=x+1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=3;
if(x==out1&&y==out2)
break;
continue;
}
if(K[x][y].left!=1&&(y-1)>=0&&K[x][y-1].zhangai==0&&K[x][y-1].flag==0)
{
K[x][y].left=1;
y=y-1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=2;
if(x==out1&&y==out2)
break;
continue;
}
if(K[x][y].right!=1&&(y+1)<=m&&K[x][y+1].zhangai==0&&K[x][y+1].flag==0)
{
K[x][y].right=1;
y=y+1;
Push(T,K[x][y].data);
K[x][y].flag=1;
e=4;
if(x==out1&&y==out2)
break;
continue;
}
if(T->top==T->base)
break;
Pop(T,&K[x][y].data); //周围无通路,后退
if(e==1)
{
x=x+1;
y=y;
}
else if(e==2)
{
x=x;
y=y-1;
}
else if(e==3)
{
x=x-1;
y=y;
}
else if(e==4)
{
x=x;
y=y+1;
}
if(T->top==T->base)
printf("No road,/n");
else
{
Pstack G;
InitStack(G);
while(T->top!=T->base)
{
Pop(T,&e);
Push(G,e);
}
printf("the road is /n");
while(G->base!=G->top)
{
Pop(G,&K[x][y].data);
printf("%d",K[x][y].data);
}
}
}
return 0;
}
相关文章推荐
- 堆栈应用之迷宫寻径
- 迷宫求解非递归 DFS BFS(应用栈和队列)
- 数据结构之栈的应用----迷宫求解
- 栈的应用举例2(迷宫求解)
- 算术表达式求解——堆栈的应用
- 数据结构的应用------------迷宫求解
- 栈的应用——求解迷宫问题
- 求解迷宫问题的所有路径及最短路径程序
- 迷宫求解问题——堆栈的使用
- 利用栈实现简单的求解迷宫程序
- 迷宫求解问题-递归(栈的应用)
- 题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)
- 队列应用2:求解迷宫问题,最短路径
- 迷宫求解_栈的应用
- 经典c程序(0035) ---迷宫求解(单条通路 类栈实现)
- 堆栈小应用(一):括号匹配程序
- 10、数据结构笔记之十栈的应用之迷宫求解实现
- 迷宫问题——堆栈应用(C++版)
- 010.栈应用迷宫求解C实例
- (5)数据结构——栈应用——迷宫求解