其实我也不咋会
迷宫问题是一个基本的搜索与回溯的练习题,迷宫问题有四种解法:深度优先搜索,广度优先搜索,A*,dijkstra。但是其他三种我都不会过于复杂,所以我只给你讲深度优先搜索算法。
假设一个瞎子在一个迷宫里(别跟我抬杠,没有导盲犬也没有手杖),他要走到这个迷宫的终点,怎么走?因为这个瞎子不仅瞎,而且是个弱智,所以他只能用弱智的方法走出这个迷宫——反复试探,撞着墙了就退回去,再向另一个方向反复试探。一般来说,我们都是顺时针撞墙试探,即先右再下再左再上。这就是dfs的基本思想——搜索+回溯,说人话就是,不撞南墙不回头。
dfs先是要判断一下到底能不能到达这个地方(只要……能到达那个地方……)要是能到,就把到达那个地方走过的路径存在一个数组里,然后走下一条道,把每个走法全列出来,取走的路径长度最小值。
注:所有搜索算法的时间复杂度都贼拉大,但是出题人一般不会太鸡贼,数据不会太大
导入头文件是婴儿都会做的事,就不管了
由于我们这道题用了数组的方法,而数组的初值又是0,所以我们不能用0和1表示空地和墙,一般用1表示空地,2表示墙。
理论存在,实践开始
首先,定义四个整型变量,表示起点坐标和终点坐标。
int sx, sy, ex, ey;
sx和sy表示起点坐标,ex和ey表示终点坐标。
紧接着,我们再定义一个变量,表示最短路径。
int minn=1145141919;
由于取的是最小值,所以我们要取一个贼拉酷炫贼拉大的数。
接下来,用二维数组存储地图和已走过的路径
int map[114][514], visit[114][514];
接下来,我们就要写函数了。
由于dfs不返回值,修改的是数组本身,所以返回值我们用void
void dfs(int x,int y,int step);
x,y分别是起点的x坐标和y坐标,step一般是0,别问,你知道就行
接下来我们来写函数里的代码
我们在dfs中,我们需要先判断步数是否小于最小值,如果小于就更新,然后回溯。
if (x == ex && y == ey) {
if (step < minn)minn = step;
return;
}
接着,开始撞墙试探
我们之前说过,试探的方向是右下左上,那么我们先写右。
if (map[x][y + 1] == 1 && visit[x][y + 1] == 0) {
visit[x][y + 1] = 1;
dfs(x, y + 1, step + 1);
visit[x][y + 1] = 0;
}
这段代码的意思是,如果右边是空地,而且没去过这个地方,那就把右边的点设置为已访问。
以此类推,我们直接把其它三个点一股脑全写上
//往下撞
if (map[x + 1][y] == 1 && visit[x + 1][y] == 0) {
visit[x + 1][y] = 1;
dfs(x + 1, y, step + 1);
visit[x +