Algorithm 使用最小行和列切换将NxN二进制矩阵转换为零矩阵
这是关于我发布的关于将一个NxN二进制矩阵转换为另一个的问题。我问的问题是一个代码挑战问题。然而,在会议上提出了一个类似的问题。我通过这条线索,对如何着手解决这个问题有了一些想法。 我在这里重申这个问题 我想编写代码来解决以下问题。我计划使用C、C++、java或Python,这取决于允许更方便的解决方案。 给出两个NxN(1相当简单的任务 首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果:Algorithm 使用最小行和列切换将NxN二进制矩阵转换为零矩阵,algorithm,matrix,Algorithm,Matrix,这是关于我发布的关于将一个NxN二进制矩阵转换为另一个的问题。我问的问题是一个代码挑战问题。然而,在会议上提出了一个类似的问题。我通过这条线索,对如何着手解决这个问题有了一些想法。 我在这里重申这个问题 我想编写代码来解决以下问题。我计划使用C、C++、java或Python,这取决于允许更方便的解决方案。 给出两个NxN(1相当简单的任务 首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果: final
final[i,j] = initial[i,j] + row_switched[i] + column_switched[j] (mod 2)
其中,row\u switched
和column\u switched
是我们切换第i行和第j列的次数。现在很清楚,它们的值应该是0或1,以获得最少的切换次数
但这实际上构成了一个方程组!我们知道初始状态(给定),我们知道最终状态(零),我们只需要根据r[i]
和c[j]
求解系统
不幸的是,由于模的存在,而且它不包括r[i]
和c[j]
上隐含的约束(即0或1),所以它仍然很复杂
让我们重写这些没有模数的条件:
row_switched[i] + column_switched[j] = 1 (if initial[i,j] = 1)
row_switched[i] - column_switched[j] = 0 (if initial[i,j] = 0)
在为每个单元格编写了这篇文章之后,我们得到了一个由N^2个方程组成的超定义系统。让我们用以下方法求解它。很明显,如果我们知道行切换[0]
的值,那么我们就知道整个列切换[]
array,因为它们是由方程明确推导出来的,row\u switched[0]
参与其中。这样就很容易推导出每一行的值
但是对于行切换[0]
,我们只有两个变量:0和1。让我们试一下它们中的每一个(见下面的注释),并分别计算两个数组!然后,我们应该检查所有方程是否都成立,并从满足整个系统且开关较少的两个集合中选择一个
如果两者都不满足,那么,好吧,这是无法解决的。试着解决这个问题,呵呵:
0 1
0 0
这就完成了解决方案。我希望您只需尝试一下,就可以使用+1。:)
关于为什么这是最少可能的开关数量的问题。实际上,任何有效的开关数量都应该满足上述方程组(0和1作为值的约束条件)但是这个系统只有两个解,我们都在上面的算法中找到了它们。因此,上面的算法肯定找到了最小的一个
注意: 在我看来,我们只能尝试集合中的一个。如果一个通过了系统,另一个也应该通过。一个集合是另一个集合的否定,所以我们只选择开关数较少的集合。开关总数为2N。但是这看起来只是,而且不如另一个部分清晰。任务相当简单 首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果:
final[i,j] = initial[i,j] + row_switched[i] + column_switched[j] (mod 2)
其中,row\u switched
和column\u switched
是我们切换第i行和第j列的次数。现在很清楚,它们的值应该是0或1,以获得最少的切换次数
但这实际上构成了一个方程组!我们知道初始状态(给定),我们知道最终状态(零),我们只需要根据r[i]
和c[j]
求解系统
不幸的是,由于模的存在,而且它不包括r[i]
和c[j]
上隐含的约束(即0或1),所以它仍然很复杂
让我们重写这些没有模数的条件:
row_switched[i] + column_switched[j] = 1 (if initial[i,j] = 1)
row_switched[i] - column_switched[j] = 0 (if initial[i,j] = 0)
在为每个单元格编写了这篇文章之后,我们得到了一个由N^2个方程组成的超定义系统。让我们用以下方法求解它。很明显,如果我们知道行切换[0]
的值,那么我们就知道整个列切换[]
array,因为它们是由方程明确推导出来的,row\u switched[0]
参与其中。这样就很容易推导出每一行的值
但是对于行切换[0]
,我们只有两个变量:0和1。让我们试一下它们中的每一个(见下面的注释),并分别计算两个数组!然后,我们应该检查所有方程是否都成立,并从满足整个系统且开关较少的两个集合中选择一个
如果两者都不满足,那么,好吧,这是无法解决的。试着解决这个问题,呵呵:
0 1
0 0
这就完成了解决方案。我希望您只需尝试一下,就可以使用+1。:)
关于为什么这是最少可能的开关数量的问题。实际上,任何有效的开关数量都应该满足上述方程组(0和1作为值的约束条件)但是这个系统只有两个解,我们都在上面的算法中找到了它们。因此,上面的算法肯定找到了最小的一个
注意:
在我看来,我们只能尝试集合中的一个。如果一个通过了系统,另一个也应该通过。一个集合是另一个集合的否定,因此我们只选择开关数较少的集合。开关数之和为2N。但这似乎只比另一个部分更清楚。让我再次尝试解释我的答案的结尾n 如果可能的话,我们已经将问题简化为通过切换将矩阵转换为零矩阵