# 迷宫 **问题描述** 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。 ``` 010000 000100 001001 110000 ``` 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D using namespace std; char mp[55][55]; int book[55][55]; int block[55][55]; int minns[55][55]; int minn = 100000; int dx[4] = {1, 0, 0, -1}; int dy[4] = {0, -1, 1, 0}; char dir[4] = {'D', 'L', 'R', 'U'}; char road[1000]; char roadans[1000]; int step; void dfs(int x, int y, int step) { if (x == 29 && y == 49) { if (step < minn) { minn = step; for (int i = 0; i < minn; i++) roadans[i] = road[i]; } return; } for (int i = 0; i < 4; i++) { int tx = x + dx[i]; int ty = y + dy[i]; if (tx >= 0 && tx < 30 && ty >= 0 && ty < 50 && book[tx][ty] == 0 && block[tx][ty] == 0 && step + 1 < minns[tx][ty]) { book[tx][ty] = 1; road[step] = dir[i]; minns[tx][ty] = step + 1; __________________ book[tx][ty] = 0; } } return; } int main() { for (int i = 0; i < 30; i++) { for (int j = 0; j < 50; j++) { char c; cin >> c; mp[i][j] = c; minns[i][j] = 10000; if (c == '1') block[i][j] = 1; } } book[0][0] = 1; dfs(0, 0, 0); for (int i = 0; i < minn; i++) cout << roadans[i]; return 0; } ``` ## aop ### before ```c ``` ### after ```c ``` ## 答案 ```c dfs(tx, ty, step + 1); ``` ## 选项 ### A ```c dfs(tx, ty, step); ``` ### B ```c dfs(tx + 1, ty + 1, step + 1); ``` ### C ```c dfs(tx - 1, ty - 1, step + 1); ```