本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题。
#include<iostream>
#include<stack>
using namespace std;
//坐标类
struct Point
{
int x;
int y;
};
//地图类
template<int A>
struct Map
{
int (*p)[A];
int row;//行数
int col;//列数
};
//start起始点, end终止点
template<int A>
bool FindPath(Map<A> & map,Point & start,Point & end)
{
//先给图的外围加上障碍
for(int i = 0;i<=map.col;i++)
{
map.p[0][i] = map.p[map.row][i] = 1;
}
for(int i = 0;i<=map.row;i++)
{
map.p[i][0] = map.p[i][map.col] = 1;
}
//用于保存路径的栈
stack<Point> stackpath;
//用于方向选择的偏移量数组 按照顺时针的方向
Point offset[4];
offset[0].x = 0; offset[0].y = 1;//向右
offset[1].x = 1; offset[1].y = 0;//向下
offset[2].x = 0; offset[2].y = -1;//向左
offset[3].x = -1; offset[3].y = 0;//向上
//将起点初始化为障碍点
map.p[start.x][start.y] = 1;
//起点入栈
stackpath.push(start);
//用于下一步方向选择的变量
int option = 0;
//下一步的最大选择变量
int MaxOption = 3;
//
while((start.x != end.x)||(start.y != end.y))
{
//选择下一步
while(option<=MaxOption)
{
int x = start.x + offset[option].x;
int y = start.y + offset[option].y;
if(map.p[x][y]!=1)
{
start.x = x;
start.y = y;
break;
}
option++;
}
//如找到了下一点
if(option<=MaxOption)
{
//入栈
stackpath.push(start);
//设置障碍
map.p[start.x][start.y] = 1;
option = 0;
}
else//没找到了下一点
{
//向后退一步,出栈
stackpath.pop();
//消除入栈时设置的障碍
map.p[start.x][start.y] = 0;
if(stackpath.empty())
{
return false;
}
//设置回溯后的option
if(start.x == stackpath.top().x)
{
if((start.y - stackpath.top().y)==1)//向右
{
option = 0;
}
if((start.y - stackpath.top().y)==-1)//向左
{
option = 2;
}
}
if(start.y == stackpath.top().y)
{
if((start.x - stackpath.top().x)==1)//向下
{
option = 1;
}
if((start.x - stackpath.top().x)==-1)//向上
{
option = 3;
}
}
option++;
start.x = stackpath.top().x;
start.y = stackpath.top().y;
}
}
//找到路径,并输出stackpath
while(!stackpath.empty())
{
cout<<"<"<<stackpath.top().x<<","<<stackpath.top().y<<">"<<endl;
stackpath.pop();
}
return true;
}
int main()
{
//建立迷宫
Map<10> map;
map.col = map.row = 9;
int p[10][10];
for(int i =0;i<10;i++)//初始化迷宫
{
for(int j=0;j<10;j++)
{
p[i][j] = 0;
}
}
//为迷宫设置障碍
p[1][3] = 1;p[1][7] = 1;p[2][3] = 1;p[2][7] = 1;
p[3][5] = 1;p[3][6] = 1;p[4][2] = 1;p[4][3] = 1;
p[4][4] = 1;p[5][4] = 1;p[6][2] = 1;p[6][6] = 1;
p[7][2] = 1;p[7][3] = 1;p[7][4] = 1;p[7][6] = 1;
p[8][1] = 1;
map.p = p;
Point start,end;
start.x = start.y = 1;
end.x =8,end.y = 8;
if(!FindPath<10>(map,start,end))
{
cout<<"该迷宫无解!"<<endl;
}
}
原文地址:http://blog.csdn.net/yyc1023/article/details/25564265