English 中文(简体)
通过文本迷宫打印到屏幕路径的算法
原标题:Algorithm to print to screen path(s) through a text maze

对于我的“ 坚固” C/坚固” 任务, 我基本上尝试从左边第二顶字符开始, 在文本文件( 流到我的矢量 < code> vec < /code > ) 中搜索一大块文本文件( 流到我的矢量 < code> vec < /code > ) 。 它用于文字迷宫, 我的程序最后应该打印出路径的字符 。

迷宫的例子如下:

###############
Sbcde####efebyj
####hijk#m#####
#######lmi#####
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############

# 是一个无法行走的墙壁, 您总是从左侧的第二个顶端字符开始。 字母字符代表可行的方形。 退出是右边的 ALWAYS。 迷宫在迷宫. text 文件中总是有 15x15 大小的大小。 字母字符重复在同一迷宫中, 但不直接相邻 。

我试图在这里做的是:如果当前方形旁边的方形有一个字母字母字符, 将其添加到矢量 < code> vec 上, 并重复此进程, 直到我到达迷宫的尽头。 最后我应该把一些迷宫中存在的多条路径打印到屏幕上, 使这个过程更加复杂 。

到目前为止,我有这个 算法本身, 我知道这是错的:

    void pathcheck()
{
    if (isalpha(vec.at(x)) && !(find(visited.begin(), visited.end(), (vec.at(x))) != visited.end()) )
    {
        path.push_back(vec.at(x));
        visited.push_back(vec.at(x));
        pathcheck(vec.at(x++));
        pathcheck(vec.at(x--));
        pathcheck(vec.at(x + 16));
        pathcheck(vec.at(x - 16));
    }
}

visited 是我的矢量跟踪所访问的方形。

我该如何更新它才能真正运作呢?最终这样我才能管理不止一条路径(即如果有两条路径,程序会打印在屏幕上 )? 我记得有人告诉我,我可能需要另一个矢量/阵列来记录我已经访问过/检查过的方形,但是我怎样才能在这里准确执行呢?

最佳回答

您在正确的轨道上。 在迷宫方面,典型的解答方法要么是通过深度第一搜索(找到某种路径的最有效解决办法),要么是通过宽第一搜索(效率低,但为了找到最佳路径而凝聚起来 ) 。 既然你似乎想进行彻底的搜索,这些选择基本上可以互换。 我建议你阅读一下:

http://en.wikipedia.org/wiki/Depeh-first_search

http://en.wikipedia.org/wiki/Breadth-first_search

基本上, 您需要剖析您的迷宫, 并将其作为一个图表( 其中每个非“ #” 是节点, 每个链接是一条可行路径 ) 。 然后, 您需要保存一份部分路径列表( 比如按您访问它们的顺序列出节点列表, 比如, [S, b, c] 是从 S 开始到 c 结束的部分路径 ) 。 外勤部和 BFS 的主要想法是您拥有一份部分路径列表, 一个一个从列表中删除项目, 从该部分路径中生成所有可能的部分路径, 然后将其放入列表并重复 。 外勤部和 BFS 的主要区别是, FFS 执行此列表作为堆叠( 即新项目具有最大的优先级), BFS 使用队列( 即新项目具有最低优先级 ) 。

所以,对于你使用外勤部的迷宫 它会这样工作:

  1. Initial node is S, so your initial path is just [S]. Push [S] into your stack ([ [S] ]).
  2. Pop the first item (in this case, [S]).
  3. Make a list of all possible nodes you can reach in 1 move from the current node (in your case, just b).
  4. For each node from step 3, remove any nodes that are part of your current partial path. This will prevent loops. (i.e. for partial path [S, b], from b we can travel to c and to S, but S is already part of our partial path so returning is pointless)
  5. If one of the nodes from step 4 is the goal node, add it to your partial path to create a completed path. Print the path.
  6. For each node from step 4 that IS NOT the goal node, generate a new partial path and push it into the stack (i.e. for [S], we generate [S, b] and push it into the stack, which now should look like [ [S, b] ])
  7. Repeat steps 2 through 6 until the stack is empty, meaning you have traversed every possible path from the starting node.

注:在您的示例中,有重复字母(例如,三个“e”)。对于您的情况,也许可以做一个简单的“节点”类,其中包括一个要持有字母的变量。这样,每个“e”将具有自己的实例,指示器将具有不同的值,这样你就可以很容易地区分出来。我不知道C++,但是在假代码中:

class Node:
    method Constructor(label):
        myLabel = label
        links = list()

    method addLink(node):
        links.add(node)

您可以读取文件中的每一个字符, 如果不是“ # ”, 为该字符创建一个新的节点实例, 并添加所有相邻的节点 。

过去3年我一直做毕松开发商,我被宠坏了。看看下面的代码。

s = "foo"
s == "foo"

在 Python 中, 这种说法是正确的 。 Python 中的“ = ” 比较字符串 s < em> content 。 我从我作为爪哇开发商的时代忘记的是, 许多语言中的“ = ” 比较字符串 s < em> pointers

我的观点是,因为这种说法不是真的, 你可以放弃制作节点类, 比较字符( 使用 : : : : : :, 不使用 strcmp ()!) 但是这个代码读起来可能有点混乱, 必须记录下来 。

总而言之,我使用某种节点类 只是因为执行比较简单 并产生更易读的代码 只需要一次解析你的迷宫!

祝你好运

问题回答

暂无回答




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签