以所需格式打印数字对

时间:2017-01-13 18:26:34

标签: c++ arrays algorithm stl-algorithm

给出一对数字,其中每个数字的频率是偶数(两列的频率之和)

1 4
1 5
2 3
3 4
2 5

我怎样才能将排列修改为一个表格,使每列的频率计数相等,这将是两列中一个数字总频率的一半,我只允许交换两个列条目。

1 4
5 1
3 2
4 3
2 5

有人可以给我一个提示,还要确保所有组件都以图表形式连接,如果断开连接打印-1?

编辑:数字分为n行和2列。

row1/col1:1
row1/col2:4
row2/col1:1
row2/col2:5

和其他

2 个答案:

答案 0 :(得分:1)

那个非常有趣的谜题!

首先我们需要做的是描述图论中的问题。图中的顶点是数组中的数字。在您的特定示例中,它将是{1,2,3,4,5}。对于每一行我们都有边缘,所以在这个例子中我们得到了这样的图:

enter image description here

这是无向图。目标是指导每一个方面。如果我们有边缘 u,v ,我们可以用两种方式之一来指导它:

  • u - > v ,这意味着我们选择行为: u v
  • v - >你,这意味着我们选择了行: v u

对于每个顶点 u 出局边的数量对应于左列中 u 的频率计数。同样地,进入的边缘对应于右列中的频率计数。

请注意,如果找到满足条件的边的方向:每个顶点都有相同数量的进入边和出边,我们也会找到解决原始问题的方法。

现在让我描述如何找到这些方向。

我们将使用两个论点:

  1. 无向图有欧拉电路,当且仅当每个顶点 u 时,它的边数是偶数。
  2. 定向图具有欧拉电路,当且仅当每个顶点 u 时, u 具有相同数量的输入和输出边缘。
  3. 如果您从未听说过Eulerian电路,请注意:https://en.wikipedia.org/wiki/Eulerian_path

    从1.我们知道,图表总是有解决方案(因为,正如您在开头所写的那样每个数字的频率甚至是)。从2.我们得到算法找到解决方案:首先我们必须找到欧拉电路,然后根据它在电路中的外观引导每个边缘。

    还有一个很好的教程如何找到欧拉电路:

    Looking for algorithm finding euler path

答案 1 :(得分:-1)

首先,只是总结一下问题:

我们有两列,其中包含许多不同的标记。 每个令牌出现偶数次。目标是交换行,以便最终每个令牌在每列中出现相同的次数。

首先,我查看所有数据,计算每个令牌出现的次数。

然后,对于每个令牌,我遍历每一列并检查是否出现该特定令牌。如果我在该列中遇到超过n / 2个令牌,那么它就会被交换。

重复整个过程,直到不再需要交换为止。

我不确定两件事情:a)一般来说,总是会解决问题(我几乎可以肯定这一定是这种情况......)? B)我可以确定迭代将永远停止。即它不会被卡住来回交换东西?

无论如何,这里有一些代码可以做到这一点。请注意,没有检查输入是否正确等。

value