上计算机网络时学了“扩散”的方法。感觉用在迷宫求解很合适。
先把地图初始化为二维数组,数组里面是一个类的一个对象。这个类有以下功能:
每一个对象有一个int型变量,盛放这个元素到初始点的最短距离。从初始点开始(此时距离为0),判断周围的对象是不是已经被“扩散”。如果没有,相邻对象距离加1,并把新对象坐标放到一个链表;如果相邻的已经被扩散,就不对它做任何改变;如果不能通过的位置,就不对这个位置处理。
class position
{
public:
bool canGoThrow;
bool isSpreaded;
int lenth;
};
例如地图为20×20的。则开始时就这样:position a[20][20];(其实这个类很简单,直接用int型二维数组就行)。
例如:先从初始点开始向四周扩散到四个相邻的对象,每个对象都在一个链表中记录,他们的距离值为1.下一步就是扩散距离为1的所有相邻对象。它们的距离为2.把每一个距离为2的都记录一个链表。扩散完之后,释放存储距离为1的链表。然后根据距离为2的链表,扩散出距离为3的链表,并相应设置其距离。直到扩散到目标位置或者不存在距离更高的位置(不能到达目的地)。
目标位置的距离就是最小距离。当要找路线是只需要根据这个点到出发点的距离,倒着找回去就可以了。
下面是一个迷宫结果(*代表最佳路径,#代表不可通过的,空白表示可以走的,@起始位置,$目标位置):
