1、问题描述

迷宫( m a z e)是一个矩形区域,它有一个入口和一个出口。在迷宫的内部包含不能穿越的墙或障碍。在图 5 - 8所示的迷宫中,障碍物沿着行和列放置,它们与迷宫的矩形边界平行。迷宫的入口在左上角,出口在右下角。图5-8 迷宫假定用 n× m的矩阵来描述迷宫,位置 ( 1 , 1 )表示入口, (n,m) 表示出口, nm分别代表迷宫的行数和列数。迷宫中的每个位置都可用其行号和列号来指定。在矩阵中,当且仅当在位置(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 }
View Code

相关文章: