acwing 3762.二进制矩阵

该博客介绍了ACwing网站上的3762题,即二进制矩阵问题。作者通过分析指出,对于任意位置的1,最多需要3次操作即可达到目标,然后详细阐述了如何通过四种变换方式对2*2子矩阵进行操作,并考虑了边界情况如右下角、最后一行和最后一列的处理。最后,给出了完整的C++代码实现。
摘要由CSDN通过智能技术生成

acwing 3762.二进制矩阵

时间:7月9日

题目链接

解题思路:

对于任意位置的1可以采取3次达到变换的目的,故对于nm的矩阵最多需要3nm次

对于矩阵的中任意选取2*2矩阵都可以采取3次变换任意一个为1的地方,如图所示左上角的变法

对于最后一列和最后一行变法如图所示

在这里插入图片描述

为了思路的清晰定义了L的四个方向,以中心点位(i,j)变换的

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
char g[N][N];
int n,m;
void pL(int i,int j,int k)//变换的四种方式
{
    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--)
    {
        cin>>n>>m;
        int res=0;
        for(int i=1;i<=n;i++)
        {
            cin>>g[i]+1;
            for(int j=1;j<=m;j++)
            if(g[i][j]=='1')
                    res+=3;
        }
        cout<<res<<endl;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(g[i][j]=='1')
                {
                    if(i<n&&j<m)//普通点位
                    pL(i,j,0),pL(i,j+1,1),pL(i+1,j,3);
                    else if(i==n&&j==m)//右下角变换
                    pL(i,j,2),pL(i-1,j,1),pL(i,j-1,3);
                    else if(i==n)//最后一行
                    pL(i,j,3),pL(i-1,j,0),pL(i,j+1,2);
                    else//最后一列
                    pL(i,j,1),pL(i,j-1,0),pL(i+1,j,2);
                }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值