2

感谢您提前查看此问题。

我正在尝试订购以下物品清单:

Bpgvjdfj,Bvfbyfzc
Zjmvxouu,Fsmotsaa
Xocbwmnd,Fcdlnmhb
Fsmotsaa,Zexyegma
Bvfbyfzc,Qkignteu
Uysmwjdb,Wzujllbk
Fwhbryyz,Byoifnrp
Klqljfrk,Bpgvjdfj
Qkignteu,Wgqtalnh
Wgqtalnh,Coyuhnbx
Sgtgyldw,Fwhbryyz
Coyuhnbx,Zjmvxouu
Zvjxfwkx,Sgtgyldw
Czeagvnj,Uysmwjdb
Oljgjisa,Dffkuztu
Zexyegma,Zvjxfwkx
Fcdlnmhb,Klqljfrk
Wzujllbk,Oljgjisa
Byoifnrp,Czeagvnj

变成如下顺序:

Bpgvjdfj
Bvfbyfzc
Qkignteu
Wgqtalnh
Coyuhnbx
Zjmvxouu
Fsmotsaa
Zexyegma
Zvjxfwkx
Sgtgyldw
Fwhbryyz
Byoifnrp
Czeagvnj
Uysmwjdb
Wzujllbk
Oljgjisa
Dffkuztu

这是通过以下方式完成的:

  1. 取第一对并将名称放入列表
  2. 使用对的第二个名称,找到它用作名字的对
  3. 将该对的第二个名称添加到列表中
  4. 重复 2 & 3

我正在用这些对填充 unordered_map,然后对每个名称进行排序并将其添加到列表中。这可以在以下代码中看到:

westIter = westMap.begin();
std::string westCurrent = westIter->second;
westList.push_front(westCurrent);

for(int i = 0; i < 30; i++)
{
    if(westMap.find(westCurrent) != westMap.end())
    {
        //find pair in map where first iterator is equal to "westCurrent"
        //append second iterator of pair to list
    }
    westIter++;
}

注意:我不确定此时“push_front”是否正确,因为我只插入了第一个值。

我的问题是有人可以给我一些关于如何解决这个问题的见解吗?因为我不确定最好的方法以及我的想法是否正确。任何见解将不胜感激。

4

2 回答 2

2

你的计划只有一个弱点。你需要首先找到连锁店的第一人,纽约先生。

你的算法假设这条线从第一个人开始。为此,您应该首先扫描整个地图以找到不作为第二个元素出现的一个名称。那是纽约先生,你可以从那里开始。push_back是你需要在这里使用的。

于 2013-01-29T02:07:29.977 回答
1
  1. 创建一个存储链的数据结构,它的正面和背面。以 'back' 为键存储在哈希表中。
  2. 创建一堆单例链(每个元素一个)
  3. 迭代地,选择一个链,在哈希表中找到它的“前”(即找到另一个与“后”具有相同元素的链)并将它们合并
  4. 这样做直到你只剩下一条链子
于 2013-01-29T03:06:12.933 回答