寻找图上的最短距离 - 逻辑问题

时间:2014-05-29 01:06:32

标签: c++ string graph

在我的C ++课程中,我们已经在图表上工作了一段时间,并且有一个问题,我已经坚持了很长一段时间。老师给了我们一个程序,它创建了一个整数图,然后能够找到图中两个整数之间的最短路径。我们的工作是将其调整为字符串的工作(具体来说,找到最短的路径只跳到与前一个单词有1个不同字母的单词,例如熊 - >胡须)。

以下是我希望我的程序可以做的一个示例:

Given the list [board, beard, bears, brand, boars, bland, blank]
it would create an edge matrix that resembled this:

board | beard boars
beard | board bears 
bears | beard boars
brand | bland
boars | board bears 
bland | brand blank
blank | bland

And then if asked to find the distance between board & bears it would output:
board->beard->bears

我调整程序的方法是创建一个名为“node”的结构图,其中包含一个数字和一个单词。我使用数字来比较一个向量中的顺序与其他变量,以及创建路径的单词。我的改编程序成功地从文本文件中的数据创建图形并连接所有具有1个字母差异的单词,但是,当我运行我的函数以找到最短距离时它绕过我的边缘并简单地打印出起始单词和结束单词是相隔1的距离。

我将在下面发布完整的,可编译的程序,并解释我对该问题的了解。

这是一个链接到两个pastebin链接(我没有足够的声誉,但发布超过两个链接,所以我必须结合它们)第一个是我的完整程序,我已经调整它使用一组单词我知道这是一个相距1的文字距离,而不是文本文件。

http://pastebin.com/W7HRZG2v

这第二个链接是我老师给出的代码下载(如果你希望看到该程序的工作版本)

我把问题缩小到如何填充向量“父母”。不知怎的,它没有正确生成,并且在程序试图从中检索路径时会产生问题。

这是一张照片的链接(声誉还不足以发布图片)比较我的老师的“健康”程序(找到2和5之间的距离)父母矢量在我的程序中的父母矢量:

http://puu.sh/95zQI/26e9b83b9a.png

请注意,在我的老师,2和4中,路径中使用的两个整数都存在于父矢量中并被调用以创建它。

请注意,在我的父母矢量中唯一出现的单词是起始单词,因此它是唯一可用于调用的单词。然而,在比较我的老师用我的方式填充父母的方式时,除了我父母是一个字符串这样的事实,我输入一个单词而不是一个数字时,我看不出任何差异:

(我的改编版本位于左侧,教师位于右侧)

if (distanceNodes[edgeNum] > distanceNodes[currNum] + 1) | if (distanceNodes[edge] > distanceNodes[curr] + 1)
{                                                        | { 
    distanceNodes[edgeNum] = distanceNodes[currNum] + 1; |     distanceNodes[edge] = distanceNodes[curr] + 1;
    parents[edgeNum] = curr->word;                       |     parents[edge] = curr; 
}                                                        | }

如果有更精通图表应用程序的人可以看一下并帮助我,我将非常感激。我已经坚持这个问题超过一个星期了,我的老师给我的唯一提示是我应该将我的程序与他的逐行比较;我这样做了,我仍然找不到问题,我准备放弃了。

如果你能帮助我,非常感谢你,

特里斯坦

1 个答案:

答案 0 :(得分:0)

下面:

node * one = createNewNode(1, "board");
...
node * three = createNewNode(3, "bears");
...
insertEdge(&g, one, three);

程序正确找到你放在那里的边缘。

更一般地说,您必须学会逐步完成代码并查看正在发生的事情。

如果可以提供帮助,请不要使用全局变量。

修改

我有空闲时间,所以这是另一个问题:

int currNum = start->num;

while (! inTree[currNum])
{
  ...
  parents[edgeNum] = curr->word;
  ...
}

您按数字进行迭代,但是您通过指针进行查找,而您永远不会更新。

我确定还有其他问题。最重要的是,你没有检查事情。由于某种原因,编程课程从未教过真正的编码人员一直在做的测试