2012-05-24 36 views
3

迷你程序应该打印出迷宫中所有可能的路线,其中入口/出发点总是从左上角向下,所有可能的出口始终在右侧壁。它从文本文件中检索迷宫。C++“迷宫”作业

迷宫实际上只是一堆文本。 迷宫由一个n×n网格组成,由“#”符号组成,这些符号是墙,以及表示可行走区域/路径的各种字母[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 

如何我会去这样做?我不需要一个完整的代码答案,我只想要一些关于如何解决这个问题的指导。

到目前为止,除了实际的算法本身,递归检查adajcent方块以查看是否可以在它们上行走,并且我不知道如何在多个路径上工作,我已经做了所有事情。

这是我迄今为止(我知道我的pathcheck是错的,但我不知道我还能做什么):

#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

你有什么试过的?您是否陷入了解决方案的某些方面?你是否已经完成了基础知识,比如将文件中的迷宫读入程序中的数据结构中? –

+0

是否允许使用递归函数? –

+1

我会使用递归和保存当前状态的列表,每次递归都会为下一步做4次递归调用。在每次递归时检查当前位置是否已被访问,以及是否为结束块。 – bdares

回答

2

你需要一些东西来启动:

  1. 代表记忆迷宫的方式 - “数据结构”这是适合于像迷宫
  2. 方法访问和操作一格该迷宫
  3. 渲染迷宫的方法 - 也许打印出一个迷宫
  4. 跟踪你的进度
  5. 算法手头
  6. 解决问题的办法

考虑从一个更小的迷宫开始 - 可能是一个尺寸为3x3的迷宫 - 具有直接穿过地图的路径。你的程序应该能够解决这个问题。然后改变路径曲线一下。然后制作更大的地图。让路径变得更难。在路上有一些“红鲱鱼”分支。

较小的地图,复杂度越来越高,应该使调试工作变得更容易。 (如果你不知道如何使用调试器,启动一个小问题将会使调试器的学习更容易。)

祝你好运!

1

我首先要做的是读取文件并将其放入数据结构中,以便实际使用它。如果这是作业,那么作业最有可能让你学习路径寻找算法,试着查找Dijkstra的算法,这应该让你开始。

+0

我正在考虑使用ifstream来读取文件...现在我怎么将它放入数据结构?我是新来的C++ – forthewinwin

+2

@forthewinwin嗯,可以说你只需选择一个二维数组作为你的结构,你将逐字读入文件并将它们放入下一个数组位置。遇到新行时,请移至阵列中的下一行。 – RoneRackal

1

一个非常高层次的方法:

创建描述您可以通过迷宫的路径树。打印出结束于右侧的结果。

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

2

通常的方法(尤其是学校作业)是递归地处理它。从指定的起点开始。从那里递归地尝试每个可能的方块(在上面,到右下方)。

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

+1

@forthewinwin我还建议你看看[A *算法](http://en.wikipedia.org/wiki/A*_search_algorithm)。 –

+2

对于所有的路由,洪水填充类型算法(递归或使用堆栈)绝对是一种可行的方式。 A *只能找到一条路线。 –

+0

我试图让它在除了正确的方向以外的其他方向..我该怎么做?我可以分别为每个方向增加位置,但是我如何将每个位置融合在一起? – forthewinwin

1

将符号加载到数组中。然后递归地检查每个位置:它可以上升,下降,左侧,右侧?从那里,您可以将这些布尔答案保存为0或1到一个单独的数组中,并根据您的副本数组是否说明您可以或不可以继续某个方向来继续。

此外,必然会使一些新的方法......我平时尽量包括在main方法很少......

希望有所帮助,希望我有时间看它更多...

-P