二进制矩阵

二进制矩阵

题目链接

思路

根据y总的结论,任意一个数为1时,我们都可以通过三次操作在不影响其他点的情况下,将其转换为0,即如图所示的方法:
在这里插入图片描述
而操作数的限制为 3nm3nm, 所以就算把每一个点都进行三次操作都是满足这个限制的

显然第一问的答案输出给定矩阵中1的个数乘以3即可。

#include <iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 110;

int n, m;
char s[N][N];

void print(int i, int j,int k) { //左上0,右上1,右下2,左下3
    if(!k)printf("%d %d %d %d %d %d\n", i, j, i+1, j , i , j+1);
    else if(k==1)printf("%d %d %d %d %d %d\n", i, j-1, i , j, i + 1, j );
    else if(k==2)printf("%d %d %d %d %d %d\n", i-1, j, i, j , i , j -1);
    else printf("%d %d %d %d %d %d\n", i - 1, j, i, j , i , j + 1);
}


int main() {
    int T;
    cin >> T;
    while (T -- ) {
        int sum = 0;
        cin >> n >> m;
        for (int i = 1; i <= n; i ++ ) {
            cin>>s[i] + 1;
            for (int j = 1; j <= m; j ++ )
                if (s[i][j] == '1') sum += 3;
        }

        cout <<sum<< endl;

        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
                if (s[i][j] == '1') {
                    if (i<n&&j<m) 
                        print(i, j,0),print(i, j+1,1), print(i+1, j,3);
                     
                    else if (i==n&&j==m) 
                        print(i,j,2),print(i - 1, j,1), print(i , j-1,3);
                        
                     else if (i == n ) 
                        print(i , j,3), print(i - 1, j ,0),print(i , j+1 ,2);
                      
                     else 
                        print(i, j ,1),print(i, j-1 ,0),print(i+1, j ,2);
                        
                    }
    }

    return 0;
}

数字矩阵

题目链接

思路

如一个矩阵
1 -2 3
1 2 3
1 2 3
我们想让(1,2)的-2变号成2
则可以通过将(1,1)和(1,2)一起变号成为-1,2
然后再将(1,1)和(2,1)一起变号成1,-1
这样就完成了将(1,1)不变,而让(1,2)和(2,1)变号

所以说变号不仅是能将其相领的元素一起变号,还可以扩充到左上左下右上右下四个方向

再推下去 每对同时变号的元素可以处于矩阵的任何两个位置

所以只要统计矩阵中有多少个负号,如果负号的数量是奇数,就证明必须有一个元素是负号,让绝对值最小的是负号就行

如果是偶数,就证明所有数都可以变成正号

#include<iostream>
#include<algorithm>
using namespace std;
int a[15][15]={0};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m,sum=0,count=0,Min=1e9;
  
        cin>>n>>m;
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];
            sum+=abs(a[i][j]);
            if(a[i][j]<0)count++;
            Min=min(Min,abs(a[i][j]));
        }
        sum-=Min*(count%2)*2;
        cout<<sum<<endl;
    }
    return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,二进制矩阵(即只有0和1的矩阵)的求逆可能不像普通实数矩阵那样直接使用inv()函数,因为二进制矩阵并不总是方阵,且它们不满足实数域中的除法运算规则。对于这种特殊的矩阵,通常有几种处理方式: 1. **如果矩阵是方阵并且满秩(即行秩等于列秩且非奇异)**: 可以先将二进制矩阵转换为等价的实数矩阵,例如,通过将每个1替换为正数(如1.0),将0替换为足够小的正数(通常用eps,MATLAB中的机器精度)。然后使用inv函数求逆。 ```matlab binaryMatrix = [binary_elements]; epsilon = eps; realMatrix = binaryMatrix + epsilon * (1 - binaryMatrix); invRealMatrix = inv(realMatrix); ``` 2. **如果矩阵不是方阵或不可逆**: 如果矩阵是行向量(行数大于列数)或列向量(列数大于行数),则无法求逆。如果是方阵但不满秩,那么它的逆矩阵不存在。 ```matlab if size(binaryMatrix, 1) ~= size(binaryMatrix, 2) error('Non-square matrix cannot be inverted.'); end ``` 3. **二进制矩阵特有的操作**: 对于某些特定的二进制矩阵,可能存在算法可以直接处理,例如,如果它是布尔矩阵(二值逻辑矩阵),可能需要应用布尔代数的原理。然而,这些方法通常涉及到复杂的逻辑运算而非简单的矩阵运算。 如果你遇到的是一个实际应用中的问题,并且矩阵确实满足条件能被转化为实数矩阵求逆,上述方法是可取的。对于特殊情况,建议查阅MATLAB文档或搜索相关的数学资料以获取更精确的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值