题目:给定一个m*n的迷宫,找到任意两个点之间的路径!如图所示
这是一个10*10的矩阵,标记为0的代表不可以走,1代表可以走,找出起点(1,1)到终点(8,8)的路径。
解题思路:对于任何一个位置(i,j),下一步共有4个方向可以选择,包括向上(i-1,j),向下(i+1,j),向左(i,j-1),向右(i,j+1);走过的点必须标记出来,避免下一次重新走,如果走到某个位置走不通了,必须退回上一个点,寻找其他路径。考虑使用递归来解决。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define StartX 1
#define StartY 1
#define EndX 8
#define EndY 8
int TraceRoute(int a[][10],int i,int j){
//1.用2标记当前的点已经走过
a[i][j]=2;
//2.标记是否结束,end=0表示还未到终点
int end=0;
if(i==EndX&&j==EndY){
end=1;
}
//3.路线选择,共有4种走法
if(end!=1&&i+1<=EndX&&a[i+1][j]==1){ //下
if(TraceRoute(a,i+1,j)==1) return 1;
}
if(end!=1&&i-1>=StartX&&a[i-1][j]==1){ //上
if(TraceRoute(a,i-1,j)==1) return 1;
}
if(end!=1&&j-1>=StartY&&a[i][j-1]==1){ //左
if(TraceRoute(a,i,j-1)==1) return 1;
}
if(end!=1&&j+1<=EndY&&a[i][j+1]==1){ //右
if(TraceRoute(a,i,j+1)==1) return 1;
}
//4.如果走到了死胡同并且没有到达终点,走不通,将当前点还原为1
if(end!=1){
a[i][j]=1;
}
return end;
}
int main(){
int a[10][10] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
{ 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
{ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 },
{ 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 1, 1, 1, 0, 1, 1, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 },
{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
for (int i = 0; i <= 9; i++){
for (int j = 0; j <= 9; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
TraceRoute(a,1,1);
for (int i = 0; i <= 9; i++){
for (int j = 0; j <= 9; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
//注意:在递归过程中,遍历的顺序影响路径的不同,答案并非唯一
拓展:我们知道,任何递归实现的函数均可以用栈来实现。我们也可以使用栈来实现迷宫,但是比较繁琐,就不写了,大家自己去找度娘,不建议掌握,面试的时候不会让写这么复杂的代码,递归已经足够了。