1、问题描述
迷宫( m a z e)是一个矩形区域,它有一个入口和一个出口。在迷宫的内部包含不能穿越的墙或障碍。在图 5 - 8所示的迷宫中,障碍物沿着行和列放置,它们与迷宫的矩形边界平行。迷宫的入口在左上角,出口在右下角。图5-8 迷宫假定用 n× m的矩阵来描述迷宫,位置 ( 1 , 1 )表示入口, (n,m) 表示出口, n和m分别代表迷宫的行数和列数。迷宫中的每个位置都可用其行号和列号来指定。在矩阵中,当且仅当在位置(i,j)处有一个障碍时其值为 1 ,否则其值为 0。图 5 - 9给出了图 5 - 8中迷宫对应的矩阵描述。迷宫老鼠( rat in a maze)问题要求寻找一条从入口到出口的路径。路径是由一组位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居(如图 5 - 1 0所示)。下面将要编写程序来解决迷宫老鼠问题。假定程序中所使用的迷宫是正方形的(即行数等入口于列数) ,且迷宫足够小,以便能在目标计算机的内存中描述整个迷宫。
2、设计
可以采用自顶向下的模块化方法来设计这个程序。不难看出,这个程序可以划分为三个部分:输入迷宫、寻找路径和路径输出。
2.1 输入迷宫
迷宫以矩阵的方式表示,输入方式可以选择让用户逐行输入,也可以从文件读取。
用户逐行输入:
1 void maze::InputMaze() 2 { 3 4 for (int rows = 1; rows < n + 1; ++rows) 5 { 6 int flag = 1; 7 cout << "请输入第" << rows << "行:" << endl; 8 while (flag) 9 { 10 for (int cols = 1; cols < n + 1; ++cols) 11 { 12 cin >> mazem[rows][cols]; 13 } 14 cout << "输入的第" << rows << "行为:"; 15 for (int cols = 1; cols < n + 1; ++cols) 16 { 17 cout << mazem[rows][cols] << " "; 18 } 19 20 if (mazem[1][1] == 1)//检查入口 21 { 22 cout << "入口应没有障碍物,请重新输入。" << endl; 23 } 24 25 if (mazem[n][n] == 1)//检查出口 26 { 27 cout << "出口应没有障碍物,请重新输入。" << endl; 28 } 29 cin.clear(); 30 cin.sync(); 31 cout << endl; 32 cout << "重新输入请输入1,继续请输入其他数字:" << endl; 33 34 int temp; 35 cin >> temp; 36 if (temp == 1) 37 { 38 flag = 1; 39 } 40 else 41 { 42 flag = 0; 43 } 44 } 45 46 47 } 48 49 cout << "输入完毕,输入的迷宫为:" << endl; 50 OutputMaze(); 51 }