算法步骤:
使用一个栈来保存符合要求的点,每次根据栈顶的点的k值(1表示上,2表示右,3表示下,4表示左)依次取下一个点,满足条件则不断循环;若某一个点的四面都不行,则进行出栈回溯。当找到这样一条路径,也要进行回溯,这样才能输出所有的路径。
实例以及代码
//定义结构体
typedef struct{
int m;
int n;
int k;
}Dian;
Dian g[30];//实现栈的作用
int top=-1,k=1;
int mg[6][6]={{1,1,1,1,1,1},//通过0和1来表示迷宫地图
{1,0,0,0,1,1},
{1,0,1,0,0,1},
{1,0,0,0,1,1},
{1,1,0,0,0,1},
{1,1,1,1,1,1}};
//出栈和入栈,同时对已经入栈的点进行标记
void Push(Dian a){
top++;
g[top]=a;
mg[a.m][a.n]=1;
}
Dian Pop(){
Dian t;
t=g[top];
mg[t.m][t.n]=0;
top--;
return t;
}
//格式化输出所有可行的路径
void Output(){
int i=1;
printf("第%d条路径为:(%d,%d)",k++,g[0].m,g[0].n);
while(i<=top)
{
printf("-->(%d,%d)",g[i].m,g[i].n);
i++;
if(i%5==0)
printf("\n\t ");
}
printf("\n");
}
//初始化每一个点,返回结构体
Dian InitialDian(int h,int l){
Dian temp;
temp.m=h;
temp.n=l;
temp.k=1;
Push(temp);
return temp;
}
//一个点一个点的递归回溯
void DealWith(Dian t){
int i;
Dian temp;
if(t.m==4&&t.n==4) //出口为(4,4)
Output();
else
{
for(i=1;i<=4;i++)
{
switch(i)//方位上右下左分别为1,2,3,4
{
case 1: if(mg[t.m-1][t.n]==0)
{
temp=InitialDian(t.m-1,t.n);
DealWith(temp);
Pop();
}
break;
case 2:if(mg[t.m][t.n+1]==0)
{
temp=InitialDian(t.m,t.n+1);
DealWith(temp);
Pop();
}
break;
case 3:if(mg[t.m+1][t.n]==0)
{
temp=InitialDian(t.m+1,t.n);
DealWith(temp);
Pop();
}
break;
case 4:if(mg[t.m][t.n-1]==0)
{
temp=InitialDian(t.m,t.n-1);
DealWith(temp);
Pop();
}
break;
}
}
}
}
//主函数
int main(){
Dian t;
t=InitialDian(1,1);//起始点为(1,1)
DealWith(t);
return 0;
}
运行结果