路径问题和最优路径
如图0为可走位置,1为不可走位置
求解思想:
用栈来实现解决问题,主要步骤是
(1)将迷宫的入口坐标设为当前坐标
(2)将当前坐标压栈,将当前坐标上的值设为-1(0变为-1),代表已走过的路
(3)判断当前坐标的四周(上下左右)是否是可以通(为0则通)的,如果是通的,那就将它的坐标设为当前坐标
(4)重复(2)(3)的操作
(5)若遇到如图1中标注的坐标,四周都不可以通(四周都不为0),那么就回退(将栈中的坐标弹出),将栈顶坐标设为当前坐标,重复步骤(3)
(6)当退回到两路的相交处则当前周围有路可以通,重复步骤(2)(3)
(7)只要判断当前位置在迷宫地图的边缘(只有边界值为0时,当前位置才可以到达边界),那么就可以判断该迷宫是否可以通
栈中的元素是迷宫通路的路线,若栈为空,则迷宫没有通路
#include<iostream>
using namespace std;
#define M 4
#define N 4
#define max ((M+2)*(N+2))
int mg[M+2][N+2] = {
1,1,1,1,1,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};
typedef struct
{
int i,j;//当期方块的位置
int di;//方向 0-3
}box;
typedef struct
{
box data[max];
int top;
}ST;
void path(int xi,int yi,int xe,int ye)
{
int i,j,k,di,flag;
ST st;
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;
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 --;
}
if(i == xe&&j == ye)
{
printf("迷宫路径如下:\n");
for(k = 0;k <= st.top;k++)
{
printf("\t(%d,%d)\n",st.data[k].i,st.data[k].j);
// if((k+1)%5==0)printf("\n");
}
printf("\n");break;
}
}
}
int main()
{
path(1,1,M,N);
return 0;
}