<pre name="code" class="cpp">/*迷宫问题
栈作为深度优先遍历(dfs):采用的搜索方法的特点是尽可能先对纵深方向进行搜索
可以最快的找到解
*/
#include<stdio.h>
#define M 8
#define N 8
#define MaxSize 1000
typedef struct
{
int i;
int j;
int di;//下一步要走的方向
}Box;
typedef struct
{
Box data[MaxSize];
int top;
}StType;//迷宫问题常用结构体
int mg[M+2][N+2]=
{
{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}
};
StType st;
void f(int top)
{
if(top>0)
{
f(top-1);
}
printf("(%d,%d)\t",st.data[top].i,st.data[top].j);
mg[st.data[top].i][st.data[top].j]=0;
}
int mgpath(int xi,int yi,int xe,int ye)
{
int i,j,di,flag;
st.top=-1;
st.top++;
st.data[st.top].i=xi;
st.data[st.top].j=yi;
st.data[st.top].di=-1;
mg[xi][yi]=-1;
while(st.top>-1)
{
i=st.data[st.top].i;
j=st.data[st.top].j;
di=st.data[st.top].di;
if(i==xe&&j==ye)
{
f(st.top);
return 1;
}
else
{
flag=0;
while(di<4&&flag==0)//深度搜索
{
di++;
switch(di)
{
case 0:
i=st.data[st.top].i-1;
j=st.data[st.top].j;
break;
case 1:
i=st.data[st.top].i;
j=st.data[st.top].j+1;
break;
case 2:
i=st.data[st.top].i+1;
j=st.data[st.top].j;
break;
case 3:
i=st.data[st.top].i;
j=st.data[st.top].j-1;
break;
}
if(mg[i][j]==0)
flag=1;
}
if(flag==1)
{
st.data[st.top].di=di;
st.top++;
st.data[st.top].i=i;
st.data[st.top].j=j;
st.data[st.top].di=-1;
mg[i][j]=-1;
}
else
{
mg[st.data[st.top].i][st.data[st.top].j]=0;
st.top--;
}
}
}
return 0;
}
int main()
{
mgpath(1,1,M,N);
return 0;
}
迷宫问题dfs
最新推荐文章于 2022-03-29 22:44:02 发布