【发布时间】:2021-01-07 19:43:36
【问题描述】:
我正在用 C++ 编写有关检查向量值的编码挑战。 我已经被困在这个挑战上几个小时了,我想不出一个合适的解决方案。 我有一个称为值的向量,看起来像这样:
std::vector <char > values {a,b,a,b,b,b,a,a,a,a,b,b,a};
然后在三个值之后开始一列,所以最后应该如何看待这些值:
abaaa
bbab
abab
玩家 1 有字母 a,玩家 2 有字母 b。如果玩家一具有正交连接的 a(不包括对角线 a),他将获得积分。如果一个 a 不与任何其他玩家连接,则玩家 1 获得一分。两个 a 值 2 分,3 a 值 5 分。总是排除对角线 a's。如果连接的 a's 超过 3 个,则玩家 1 额外获得 2 分。例如 4 a 的 7 分和 5 a 是 9 分。这也适用于玩家 2。棘手的部分是玩家可以获得不止一组正交连接的 a 或 b 的分数。例如,如果玩家 1 有一组 3 个 a,他得到 5 分。如果他也有一个a,他会得到一分。所以最后他一共得到6分。
abaaa
bbab
abab
玩家 1 得到:9+1+1
玩家 2 得到:7+2
我希望我的问题很清楚。 如果我能使用任何提示或算法,我将不胜感激。
我真的不知道如何开始。
【问题讨论】:
-
听起来需要flood fill algorithm
-
或者深度优先搜索算法。目前想不出任何其他算法。
-
我之前没有听说过洪水填充算法,但类似的方法是找到所有连接的组件。我们有一条从一个节点到它的四个主要邻居中的任何一个的边,如果主要邻居具有与该节点相等的值。处理后,我们只需要计算每个连通分量的大小和关联的值,并将计算的分数加到对应的玩家身上。首先将输入字符串重新格式化为二维网格可能会有所帮助,但如果你很聪明,可以将原始字符串作为图形遍历。
-
@john 我检查了洪水填充算法的实现,它们使用多维向量。它也适用于一维向量吗?
-
@konoha 除非我误解了,否则 概念上 你有 2D 结构,即使你实际上是把它放在 1D 向量中。因此,只要您可以在一维向量中计算出上、下、左、右相邻位置(以及边缘所在的位置),您就可以执行洪水填充操作。 (例如,通过将 3 添加到当前索引来完成向左移动)。