给出一对数字,其中每个数字的频率是偶数(两列的频率之和)
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
和其他
答案 0 :(得分:1)
那个非常有趣的谜题!
首先我们需要做的是描述图论中的问题。图中的顶点是数组中的数字。在您的特定示例中,它将是{1,2,3,4,5}。对于每一行我们都有边缘,所以在这个例子中我们得到了这样的图:
这是无向图。目标是指导每一个方面。如果我们有边缘 u,v ,我们可以用两种方式之一来指导它:
对于每个顶点 u 出局边的数量对应于左列中 u 的频率计数。同样地,进入的边缘对应于右列中的频率计数。
请注意,如果找到满足条件的边的方向:每个顶点都有相同数量的进入边和出边,我们也会找到解决原始问题的方法。
现在让我描述如何找到这些方向。
我们将使用两个论点:
如果您从未听说过Eulerian电路,请注意:https://en.wikipedia.org/wiki/Eulerian_path
从1.我们知道,图表总是有解决方案(因为,正如您在开头所写的那样每个数字的频率甚至是)。从2.我们得到算法找到解决方案:首先我们必须找到欧拉电路,然后根据它在电路中的外观引导每个边缘。
还有一个很好的教程如何找到欧拉电路:
答案 1 :(得分:-1)
首先,只是总结一下问题:
我们有两列,其中包含许多不同的标记。 每个令牌出现偶数次。目标是交换行,以便最终每个令牌在每列中出现相同的次数。
首先,我查看所有数据,计算每个令牌出现的次数。
然后,对于每个令牌,我遍历每一列并检查是否出现该特定令牌。如果我在该列中遇到超过n / 2个令牌,那么它就会被交换。
重复整个过程,直到不再需要交换为止。
我不确定两件事情:a)一般来说,总是会解决问题(我几乎可以肯定这一定是这种情况......)? B)我可以确定迭代将永远停止。即它不会被卡住来回交换东西?
无论如何,这里有一些代码可以做到这一点。请注意,没有检查输入是否正确等。
value