您的位置:首页 > 其它

回溯法解决迷宫搜索问题

2017-03-31 14:45 190 查看
算法思路:定义一个二维数组,其中的0代表通路,1代表墙,然后定义一个结构体表示每一个节点的属性,struct St //定义一个栈,保存路径

{

int i; //当前方块的行号

int j; //当前广场的列号

int di; //di是下一可走方位的方位号

}

然后定义一个栈来存储节点。

#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;

//用栈实现路径的存储
#define MaxSize 100

int mg[10][10] = {      //定义一个迷宫,0表示通道,1表示墙
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,1,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}};

struct St                //定义一个栈,保存路径
{
int i;               //当前方块的行号
int j;               //当前广场的列号
int di;              //di是下一可走方位的方位号
} St[MaxSize];           //定义栈

int top = -1;            //初始化栈指针

void MgPath(int xi, int yi, int xe, int ye)            //路径为从(xi,yi)到(xe,ye)
{
int i, j, di, find, k;
top++;                                             //初始方块进栈
St[top].i = xi;St[top].j = yi;St[top].di = -1;
mg[xi][yi] = -1;
while(top>-1)                                      //栈不为空时循环
{
i = St[top].i;j = St[top].j;di = St[top].di;
if(i==xe && j==ye)                             //找到了出口,输出路径
{
cout << "the road this"<<endl;
for(k=0; k<=top; k++)
{
cout << "  (" << St[k].i << "," << St[k].j << ")";
if((k+1)%5==0) cout << endl;            //每输出五个方块后换一行
}
cout << endl;
return;
}
find = 0;
while(di<4 && find==0)                          //找下一个可走方块
{
di++;
switch(di)
{
case 0:i = St[top].i-1; j = St[top].j; break;
case 1:i = St[top].i; j = St[top].j
aaec
+1; break;
case 2:i = St[top].i+1; j = St[top].j; break;
case 3:i = St[top].i; j = St[top].j-1; break;
}
if(mg[i][j]==0) find = 1;                      //找到通路
}
if(find==1)                                        //找到了下一个可走方块
{
St[top].di = di;                               //修改原栈顶元素的di值
top++;                                         //下一个可走方块进栈
St[top].i = i; St[top].j = j; St[top].di = -1;
mg[i][j] = -1;                                 //避免重复走到这个方块,这一步相当关键,走过的路径要设置成-1.
}
else                                               //没有路可走,则退栈
{
mg[St[top].i][St[top].j] = 0;                  //让该位置变成其它路径可走方块
top--;                        //回退到上一个位置
}
}
cout << "there is no road!/n";
}

int main()
{
MgPath(1,1,8,8);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维数组 算法