描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入

第一行是两个整数n和m(1 <= n,m <= 100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符’.’表示空地,’#’表示墙,’S’表示起点,’T’表示出口。

输出

输出从起点到出口最少需要走的步数。(你不能起出迷宫外)

样例输入
3 3
S#T
.#.
...

样例输出
6

解题思路:

1、先找到入口和出口的位置,通过二维数组记录其位置
2、从入口开始,对上下左右进行判断找点,然后通过另一个数组来记录走过的路径
3、走过的位置可以标记,但这里可以用次序来标记,也就是顺带能实现走了几步
4、因为每一次的判断都相同,所以可以使用“递归”
5、如果能够使用递归,那么同样也就能通过for循环来解决。### 出错点:
1、没有使用自增,或者加1后赋值回去,导致计数根本没有改变
2、不知道二维数组的初始化要用memset,并且不够理解memet是如何赋值给整型数组的

代码原封不动地记录了我思考的整个过程^_^

#include <iostream>
#include <cstring>
using namespace std;
char map[101][101];//字符数组
int done[101][101];//二维数组不能简单地像一维数组直接={ 0 }
int n, m;// n行m列
int minstep = 0;//记录最小步数

                //从入口进入后开始判断
void path(int in1, int in2, int out1, int out2) {
    int count = done[in1][in2];
    //整个函数的思想是:每一次都是一个新的起点开始,对上下左右进行判断
    //所以,就可以使用递归的方法,并且当新的起点恰好就是出口的时候,迷宫结束。
    if (in1 == out1 && in2 == out2) {
        minstep = count;
    }
    count++;//可以把count先自增

    //下面开始对上下左右进行判断
    //在“最外层”是需要分别考虑的,所以有限制条件
    //判断“上”
    if (in1 > 0 && map[in1 - 1][in2] != '#' && done[in1 - 1][in2] > count) {
        done[in1 - 1][in2] = count;//把这个位置记录成下一步要走的次序
                                       //然后再以这个点作为新的起点,再次判断
        path(in1 - 1, in2, out1, out2);
    }
    //后面的三个方向都如此判断
    //判断“下”
    if (in1 < n - 1 && map[in1 + 1][in2] != '#' && done[in1 + 1][in2] > count) {
        
        done[in1 + 1][in2] = count;
        path(in1 + 1, in2, out1, out2);
    }
    //判断“左”
    if (in2 > 0 && map[in1][in2 - 1] != '#'&& done[in1][in2 - 1] > count) {
        done[in1][in2 - 1] = count;
        path(in1, in2 - 1, out1, out2);
    }
    //判断“右”
    if (in2 < m - 1 && map[in1][in2 + 1] != '#' && done[in1][in2 + 1] > count) {
        done[in1][in2 + 1] = count;
        path(in1, in2 + 1, out1, out2);
    }


}

int main() {
    int inx, iny, outx, outy;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            //在记录地图的同时,对入口和出口进行判断
            cin >> map[i][j];
            if (map[i][j] == 'S') {
                inx = i;
                iny = j;
            }
            if (map[i][j] == 'T') {
                outx = i;
                outy = j;
            }
        }
    }
    
    memset(done, 2, sizeof(done));//赋的值是0x02020202
    
    /*
    //使用循环进行赋值
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            done[i][j] = 99;
        }
    }
    cout << endl;
    //验证memset到底赋了什么值
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << done[i][j];
        }
    }
    cout << endl;
    */
    

    done[inx][iny] = 0;//起点设置为第0步
    path(inx, iny, outx, outy);
    cout << minstep << endl;

    return 0;
}

 思考的过程比最后的结果要重要^_^