3

小程序应该打印出通过迷宫的所有可能路线,其中入口/起点总是从左上角向下一个,所有可能的出口总是在右墙上。它从文本文件中检索迷宫。

迷宫实际上只是一堆文字。迷宫由一个 nxn 网格组成,该网格由作为墙壁的“#”符号和代表可步行区域/路径的各种字母 [a...z] 组成。字母可以重复,但永远不能并排。

迷宫是 15x15。

大写的 S 始终标记入口,位于第二高点的左墙上。一条可能的路径只能通过字母 - 你不能在 # 符号上行走。右边墙上的任何字母都代表出口。

例如,

######
Sa#hln
#bdp##
##e#ko
#gfij#
######

是一个可能的迷宫。我的小程序应该在读取实际包含迷宫的文本文件后打印出所有可能的路线。

对该程序的调用将在屏幕上生成以下输出:

Path 1: S,a,b,d,e,f,i,j,k,o
Path 2: S,a,b,d,p,h,l,n
2 total paths

我会怎么做?我不需要完整的代码答案,我只需要一些有关如何解决此问题的指导。

到目前为止,除了递归检查相邻方块以查看您是否可以在它们上行走的实际算法本身之外,我已经完成了所有工作,而且我不知道如何在多条路径上工作。

这是我到目前为止所拥有的(我知道我的路径检查是错误的,但我不知道还能做什么):

    #include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <cstdio>
using namespace std;

ifstream file("maze.txt");
vector<char> vec(istreambuf_iterator<char>(file), (istreambuf_iterator<char>())); // Imports characters from file
vector<char> path;                      // Declares path as the vector storing the characters from the file
int x = 18;                             // Declaring x as 18 so I can use it with recursion below
char entrance = vec.at(16);             // 'S', the entrance to the maze
char firstsquare = vec.at(17);          // For the first walkable square next to the entrance
vector<char> visited;                   // Squares that we've walked over already

int main()
{
    if (file) {
        path.push_back(entrance);               // Store 'S', the entrance character, into vector 'path'
        path.push_back(firstsquare);            // Store the character of the square to the right of the entrance
                                                // into vector 'path'.

        while (isalpha(vec.at(x)))
        {
            path.push_back(vec.at(x));
            x++;
        }

        cout << "Path is: ";                    // Printing to screen the first part of our statement

        // This loop to print to the screen all the contents of the vector 'path'.
        for(vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)  // 
        {
        std::cout << *i << ' ';
        }

        cout << endl;
        system ("pause");                       // Keeps the black box that pops up, open, so we can see results.
        return 0;
        }
}

谢谢!

4

5 回答 5

2

通常的方法(特别是对于学校作业)是递归地处理它。从指定的起点出发。从那里递归地尝试每个可能的正方形(上、右、下)。

唯一真正的“技巧”是跟踪您已经访问过哪些广场。一种可能性是在输入时将值保存在一个正方形中,然后在递归搜索其他正方形之前,将其设置为其他未使用的值(例如,'.' 应该适用于您的情况)。

于 2012-05-24T03:27:44.460 回答
2

您需要做一些事情才能开始:

  1. 一种在内存中表示迷宫的方式——一种适合像迷宫这样的网格的“数据结构”
  2. 访问和操作迷宫的方法
  3. 一种绘制迷宫的方法——也许是打印出一个迷宫
  4. 一种跟踪进度的方法
  5. 解决手头问题的算法

考虑从一个小得多的迷宫开始——也许是一个 3x3 大小的迷宫——其路径直接穿过地图。你的程序应该能够解决这个问题。然后将路径更改为弯曲一点。然后把地图变大。让路更难走。在路径上放置一些“红鲱鱼”分支。

较小的地图,复杂性增加,应该使调试工作更容易。(如果你不知道如何使用调试器,那么从一个小问题开始会更容易学习调试器。)

祝你好运!

于 2012-05-24T02:52:59.573 回答
1

我首先要做的当然是读入文件并将其放入数据结构中,以便您可以实际使用它。如果这是家庭作业,那么该作业很可能让您学习寻路算法,尝试查找 Dijkstra 的算法,这应该可以帮助您入门。

于 2012-05-24T02:49:23.540 回答
1

将符号加载到数组中。然后递归检查每个位置:它可以上,下,左,右吗?从那里,您可以将这些布尔答案作为 0 或 1 保存在一个单独的数组中,并使用它继续...根据您的副本数组是否表示您可以或不能在某个方向上继续。

另外,一定要制作一些新方法……我通常会尝试在主要方法中包含很少的内容……

希望对你有帮助,希望我有时间看更多...

-P

于 2012-05-25T21:04:06.867 回答
1

一个非常高级的方法:

创建一棵树,描述您可以通过迷宫的路径。打印出在右侧结束的那些。

您将如何检测环绕自身的路径?(或者你的迷宫不会有这个问题?)

于 2012-05-24T02:51:17.047 回答