对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到

源地址: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的误判,这是由于第一行第一列的元素的相邻元素少于其邻居的相邻元素所导致的。

递归方式:

第一种,先遍历第一行第一列,然后去掉第一行第一列,然后遍历余下部分的第一行第一列,如下


第二种,先遍历第一行第一列和最后一行最后一列,然后再遍历余下部分的第一行第一列和最后一行最后一列,有四周向中心,如下


两种递归方式都是先遍历相邻元素较少的元素,然后递归下去。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值