算法将一个硬币矩阵转移到另一个硬币阵列
algorithm transfer one coin matrix to another coin matrix
描述:
桌面上有m*n(m<=100,n</100)个硬币形成m行n列的硬币矩阵。每枚硬币要么面朝上,要么面朝后,用0或1表示。
游戏规则是:
(1) 每次,你都可以反转一排硬币
(2) 每次都允许交换两列。
对象:
从初始矩阵->目标矩阵
输入:
1.k测试次数
2.m n行和列的计数
3.初始矩阵和目标矩阵的数目
输出从初始矩阵到目标矩阵的最小步长,如果不可能从初始矩阵转移到目标矩阵,则输出-1。
样本输入
2
4 3
1 0 1
0 0 0
1 1 0
1 0 1
1 0 1
1 1 1
0 1 1
1 0 1
4 3
1 0 1
0 0 0
1 0 0
1 1 1
1 1 0
1 1 1
0 1 1
1 0 1
样本输出
2
-1
我已经编码了一个解决方案:mysolution.cc,它列举了所有的可能性,哪个是正确的,但太慢了,你能提供一个正确但快速的解决方案吗。
谢谢。
行始终位于同一位置,因此如果行r
以k
开始,则它将始终具有k
或columns - k
。
- 对于每一行,检查是否为
count_of_ones(initial,row) == count_of_ones(target,row)
,如果为,则为好,否则检查是否为count_of_ones(initial,row) = columns - count_of_ones(target,row)
,如果是,则翻转行,否则输出-1
。正如@maniek所指出的,当恰好有一半的列包含一个列时,这就不那么容易了。这样的行必须在步骤2中进行处理,以尝试形成所需的列 - 对于每一列,计算目标和工作矩阵中的1数(在适当地翻转行之后)。如果计数序列不是彼此的排列,则输出
-1
,否则尝试找到将工作转换为目标的列的排列(工作和目标之间相同的任何列都必须保持固定)。如果不可能,输出-1
,否则找到实现该排列所需的最小交换次数
我会给你一些想法。您可以逐行比较。如果第一个矩阵的第i行的数字与第二个矩阵的第一行的数字相同,则不求逆。如果第一个矩阵的第i行的数字1与第二个矩阵的第一行的数字0相同,则必须求逆。如果这两者都不是真的,那么就没有解决方案。这都是关于反演的。
现在,所有列都相等,但顺序不同(第二个矩阵从第一个矩阵排列了列)。如果列不是相互排列的,则返回-1。这个问题等于找到将一个排列转换为另一个排列的最小交换次数。
相关文章:
- 最小硬币更换问题(自上而下方法)
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 如何将元素从向量转移到新数组?
- 如何在硬币兑换问题中找到硬币的数量
- 为什么系统函数总是在C++中返回已转移的退出状态?
- 硬币兑换:找到多种方法来重现给定的总和
- C++:将 UDP 袜子转移到新位置
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 在 c++ 中模拟抛硬币时,模数如何工作?
- 如何在MPI中将矩阵从一个进程转移到另一个进程
- 用给定面值的最小硬币数量计价金额.贪婪的问题
- 抛硬币计数游戏C++数据结构!.
- 如何在硬币兑换中添加记忆
- Qt将鼠标移动事件转移到新窗口
- 使用OpenCV计数硬币
- 将进程的执行从线程1转移到线程2
- 如何在SOCI中注册数据库故障转移回调?
- 如何缩短此C++代码?(硬币兑换计算器)
- 这个C++结构如何从函数转移到"你的"成员
- 算法将一个硬币矩阵转移到另一个硬币阵列