0

我有一个有序的字符串,需要呈现给用户:

ABCCDDCBBBCBBDDBCAAA

用“B”表示的对象被标记,这样 2 个 B 后面会有一个“~”。

AB~CCDDCB~BBCBBDDBCAAA
AB~CCDDCBB~BCBBDDBCAAA
AB~CCDDCBBB~CBBDDBCAAA
and so on...

我使用了Howard Hinnant 的组合库,它适用于这个简单的案例。我的测试代码使用位置向量作为通过 for_each_combination 发送的整数。

但是,当我有多个 B 标记时,我不知道该怎么做。

例如,总共 4Bs 需要标记,2 由 '~' 和 2 由 '#'

AB~CCDDCB~B#B#CBBDDBCAAA
AB#CCDDCB~B~B#CBBDDBCAAA
AB~CCDDCB#B~B#CBBDDBCAAA
AB#CCDDCB#B~B~CBBDDBCAAA
ABCCDDCB~B~B#CB#BDDBCAAA
and so on...

我写的伪代码是级联的。在第一个 for_each_combination 之后,对于每个结果组合,将每隔一个位置复制到另一个向量并执行另一个 for_each_combination。

考虑到我将使用的组合数量,我希望有更好的方法。

4

2 回答 2

2

这听起来像是家庭作业,所以首先我不会只给你代码,其次我添加了 [homework] 标签。

现在,有四个标记要放置,一个合理的解决方案是一组嵌套的 for 循环,其中四个

标记仅限于 7 个位置,因此只需从 0 计数到 6,包括 0 到 6

然后将其转换为字符串中的位置

然后输出带有标记的字符串

我已经验证这很简单

如果您需要进一步的帮助,只需提出一个新问题(并展示您到目前为止所获得的信息)

于 2012-06-18T20:39:07.097 回答
1

我相信经过一番观察,我已经回答了自己的问题。

首先,我从使用 Howard 的库切换到 Hervé 的组合库。主要的吸引力是使用 next_combination 允许我将组合计算链接在一起,如下所示:

do {
    do {
    cout << values << endl;
    } while (next_combination(values.begin() + 3, values.begin() + 5, values.end()));
} while (next_combination(values.begin(), values.begin() + 3, values.end()));

我需要将它按摩到一个迭代器中,但这正是我所需要的。

于 2012-06-18T21:04:17.633 回答