【C语言探讨】-【迷宫求解-堆栈-回溯(含注释流程图)】
这是我根据一本书上的描述自己写的代码和流程图,请高手多多指点~
迷宫-堆栈练习(含注释,流程图).rar
(88.14 KB)
//此程序有错 欢迎讨论
//最后编辑:2012年4月14日
#include<stdio.h>
//#include"堆栈.cpp"
int rep[99];//记录当前位置数组
int i,j;//当前位置参数
#define MAX 100
int stack[MAX];//堆栈数组
int tos=0; //记录栈顶位置
void walk(int); //移动位置函数
int maze[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,1,0,1,1},
{1,1,0,1,0,0,0,0,0,1},
{1,0,0,1,1,1,0,1,1,1},
{1,0,1,1,0,0,0,0,1,1},
{1,0,1,0,1,1,1,1,0,1},
{1,0,1,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,1,1,1},
{1,0,0,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};//迷宫二维数组
/****************************以下为堆栈函数************************************/
void push(int h)//压栈
{
if(tos>=MAX)
{
printf("Stack overflow\n");
// return 0;
}
stack[tos]=h;
tos++;
}
int pop()//出栈
{
tos--;
if(tos<0)
{
printf("Stack underflow\n");
return 0;
}
return stack[tos];
}
int empty()//是否为空
{
if(tos<0)
return 1;
else
return 0;
}
/****************************以上为堆栈函数************************************/
jilu(int a,int b)//记录当前位置函数,十位和个位分别表示 x轴,y轴 方位
{
static n=0;
rep[n]=a*10+b;
n++;
}
void main()
{
int now=11;
walk(now);
while(!empty())//输出存放的路径
{
i=pop();
printf("%d",i);
}
}
int report(int i,int j)//对比当前位置函数
{
int k=0;
int flag=1;
while (rep[k]!='\0')
{
if(rep[k]==i*10+j)
{
flag=0;//即 搜索到此位置已走过
break;
}
else k++;
}
return flag;
}
void walk(int now)//移动方位函数
{
while(now!=88)
{
i=now/10;j=now%10;
if(maze[i][j-1]!=1&&report(i,j-1))//向下方向 为0且没走过 则移动一次
{
jilu(i,j-1);//记录当前位置
now=i*10+j-1;
walk(now);
}
else if(maze[i+1][j]!=1&&report(i+1,j))
{
jilu(i+1,j);
now=(i+1)*10+j;
walk(now);
}
else if(maze[i][j+1]!=1&&report(i,j+1))
jilu(i,j+1);
now=i*10+j+1;
walk(now);
}
else if(maze[i-1][j]!=1&&report(i-1,j))
{
jilu(i-1,j);
now=(i-1)*10+j;
walk(now);
}
else now=pop();//如果无路可走就 回溯 一次
}
}