• 二进制矩阵(秋季每日一题 2)


    给定一个 n × m n×m n×m 大小的二进制矩阵,矩阵中只包含 0 0 0 1 1 1

    现在,你可以进行如下操作:选中一个 2 × 2 2×2 2×2 的子矩阵,改变其中 3 3 3 个元素的值( 0 0 0 变为 1 1 1 1 1 1 变为 0 0 0)。

    你的任务是通过上述操作,将矩阵中的全部元素都变为 0 0 0

    你的总操作次数不得超过 3 n m 3nm 3nm 次。

    可以证明,答案一定存在。

    输入格式
    第一行包含整数 T T T,表示共有 T T T 组测试数据。

    每组数据第一行包含整数 n , m n,m n,m

    接下来 n n n 行,每行包含一个长度为 m m m 01 01 01 字符串,表示给定的二进制矩阵。

    输出格式
    每组数据第一行输出整数 k k k,表示操作次数,注意 k k k 的权值范围 [ 0 , 3 n m ] [0,3nm] [0,3nm]

    接下来 k k k 行,每行包含 6 6 6 个整数 x 1 , y 1 , x 2 , y 2 , x 3 , y 3 x1,y1,x2,y2,x3,y3 x1,y1,x2,y2,x3,y3,描述一次操作中选中的元素的坐标为 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x1,y1),(x2,y2),(x3,y3) (x1,y1)(x2,y2)(x3,y3)

    元素位置不能相同,且必须出自同一 2 × 2 2×2 2×2 子矩阵中。

    行列均从 1 1 1 开始计数, ( 1 , 1 ) (1,1) (1,1) 表示输入矩阵中位于左上角的元素, ( n , m ) (n,m) (n,m) 表示输入矩阵中位于右下角的元素。

    输出任意合理方案均可。

    数据范围
    1 ≤ t ≤ 5000 , 1≤t≤5000, 1t5000,
    2 ≤ n , m ≤ 100 , 2≤n,m≤100, 2n,m100,
    保证将同一测试点内的每组数据的 n m nm nm 相加一定不超过 20000 20000 20000

    输入样例:

    5
    2 2
    10
    11
    3 3
    011
    101
    110
    4 4
    1111
    0110
    0110
    1111
    5 5
    01011
    11001
    00010
    11011
    10000
    2 3
    011
    101
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出样例:

    1
    1 1 2 1 2 2
    2 
    2 1 3 1 3 2
    1 2 1 3 2 3
    4
    1 1 1 2 2 2 
    1 3 1 4 2 3
    3 2 4 1 4 2
    3 3 4 3 4 4
    4
    1 2 2 1 2 2 
    1 4 1 5 2 5 
    4 1 4 2 5 1
    4 4 4 5 3 4
    2
    1 3 2 2 2 3
    1 2 2 1 2 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    每次 L L L 操作可以改变 3 3 3 个位置的值
    对每个位置的 1 1 1,都可以通过 3 3 3 L L L 操作改变其值,而不改变矩阵中其它位置的值,所以只需要 3 3 3 ∗ * ( 1 1 1 的个数) 次 L L L 操作,就可以让全部的 1 1 1 变为 0 0 0,而不改变原来的 0 0 0 的值。

    #include
    
    using namespace std;
    
    const int N = 110;
    
    int n, m;
    char g[N][N];
    
    void pl(int i, int j, int k){
        
        if(k == 1) printf("%d %d %d %d %d %d\n", i-1,j,i,j,i,j+1);
        else if(k == 2) printf("%d %d %d %d %d %d\n", i,j,i,j+1,i+1,j);
        else if(k == 3) printf("%d %d %d %d %d %d\n", i,j-1,i,j,i+1,j);
        else printf("%d %d %d %d %d %d\n", i-1,j,i,j-1,i,j);
    }
    
    int main(){
        
        int t;
        cin >> t;
        
        while(t--){
            
            cin >> n >> m;
            
            for(int i = 1; i <= n; i++)
                cin >> g[i] + 1;
            
            int res = 0;
            for(int i = 1; i <= n; i++)
                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, 2), pl(i, j+1, 3), pl(i+1, j, 1);
                        }else if(i == n && j == m){
                            pl(i, j, 4), pl(i, j-1, 1), pl(i-1,j, 3);
                        }else if(i == n){
                            pl(i, j, 1), pl(i-1, j,2), pl(i, j+1, 4);
                        }else {
                            pl(i, j, 3), pl(i+1, j, 4), pl(i, j-1, 2);
                        }
                    }
            
        }
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    怎么把录音转文字?只需三步,手把手教会你
    02 java包装类型的缓存机制
    斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络
    安装MySQL
    内存分析之GCViewer详细解读
    解决/usr/bin/env: ‘python\r’: No such file or directory
    一套 .NET开发的邮箱Mail开源库
    leetCode 123.买卖股票的最佳时机 III 动态规划 + 状态压缩
    C++面向对象:重写、重载、隐藏
    Java笔记(工厂模式、动态代理、XML)
  • 原文地址:https://blog.csdn.net/qq_46456049/article/details/126863986