我有一个有序的字符串,我需要呈现给用户:
ABCCDDCBBBCBBDDBCAAA
'B'表示的对象被标记,这样2个B在它们后面会有'〜'。
AB~CCDDCB~BBCBBDDBCAAA
AB~CCDDCBB~BCBBDDBCAAA
AB~CCDDCBBB~CBBDDBCAAA
and so on...
我使用了Howard Hinnant的combinations library,它适用于这个简单的案例。我的测试代码使用位置向量作为通过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。
考虑到我将要合作的组合数量,我希望有更好的方法。
答案 0 :(得分:2)
这听起来像是家庭作业,所以首先我不会只给你代码,其次我添加了[家庭作业]标签。
现在,要放置四个标记,合理的解决方案是一组嵌套for循环,其中四个
标记限制在7个位置,因此只需从0到6计算,包括
然后将其转换为字符串中的位置
然后输出带有标记
的字符串我已经确认这很容易做到
如果您需要进一步的帮助,只需提出一个新问题(并显示您目前所获得的内容)
答案 1 :(得分:1)
我相信经过一番观察后我已回答了自己的问题。
首先,我从使用霍华德的图书馆转到了Hervé的combinations library。主要的方法是使用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()));
我需要将它按到迭代器中,但这正是我需要的。