源地址:http://blog.csdn.net/crasyangel/article/details/11138243
以4*4矩阵为例
1、全部红线元素设为集合A,全部黑线元素设为集合B;A或者B里面的元素彼此互不相邻,对其值没有贡献;也就是说对A里面的元素的值产生贡献的都是B集合里面的元素,sum(A)=sum(B)。
2、任一元素必须小于等于其相邻元素(上下左右)之和
3、以上两点均为必要性,其实满足以上两点的正整数矩阵一定可以由一个全零矩阵经过该运算得到。
考虑以下这种情况,无论A集合中哪个或者哪几个元素意外的增大或减小,只要其满足条件2,这个增大或者减小一定可以通过其相邻的元素传给B集合的任意一个或者多个元素。
还有一个方法,就是正数矩阵进行这种运算的逆运算,看看能否得到全零矩阵。
从第一行第第一列开始遍历第一行和第一列所有的元素,如果为0,则跳过;如果非0,那么选择其任一非0邻居,双方进行减1操作,如果该邻居已经减到0,那么挑选下一个非0邻居,直到自身减到0为止,如果自身不能减到0,则说明该元素不满足条件2,即该正数矩阵不能由一个全零矩阵经过该运算得到。
注意,遍历第一行时优先选择其左右邻居,遍历第一列时优先选择其上下邻居,否则可能会导致满足条件的某元素不能减到0的误判,这是由于第一行第一列的元素的相邻元素少于其邻居的相邻元素所导致的。
递归方式:
第一种,先遍历第一行第一列,然后去掉第一行第一列,然后遍历余下部分的第一行第一列,如下
第二种,先遍历第一行第一列和最后一行最后一列,然后再遍历余下部分的第一行第一列和最后一行最后一列,有四周向中心,如下
两种递归方式都是先遍历相邻元素较少的元素,然后递归下去。