3.2 走迷宫
【问题描述】从文件 map.txt 中读入一个 m 行 n 列的迷宫,其中 0 代表可以通过,1 代表不可通过(墙)。
请给出一条从(1,1)出发到(m,n)的路径。如果不能到达,输出“Failed”。例如:
10 8
0001000000
0101011110
0111000100
0001010111
0100010001
0111011100
1101010101
0000010000
(1) 预处理
为了防止在搜索时发生下标越界,我们需要做一个小处理:在迷宫的外圈圈上一层围墙,即
111111111111
100010000001
101010111101
101110001001
100010101111
101000100011
101110111001
111010101011
100000100001
111111111111
以下是一些定义:
char map[110][110]; // 先行后列。
bool visited[110][110];
point prev[110][110]; // 记录路径的方法:从A结点扩展到B结点时,将prev[B]设为A。
struct point {int r,c;};
int n,m;
void flag(int r, int c) // 追踪结点,在经过的路径上画箭头。
{
point &t=prev[r][c];
if (!(r==1&&c==1)) flag(t.r,t.c);
if (t.r==r && t.c<c) map[r][c]