• CrazyRows


    该图片摘自http://blog.csdn.net/qq_33823833/article/details/73881823

    输出

    0

    样例2

    输入

    3

    001

    100

    010

    输出

    2

    样例3

    输入

    4

    1110

    1100

    1100

    1000

    输出

    4

    分析

    观察三个样例的下三角矩阵会发现,下三角矩阵的每一行的最右边的1的位置不会超过行号,满足这个条件就可以构成下三角矩阵。从第一行开始一个个找下三角矩阵的每一行,从上到下遍历输入的矩阵,一旦找到满足要找的三角矩阵的行,就让它交换到三角矩阵要找的行处,然后再继续从上到下遍历输入的矩阵,找三角矩阵的下一行,这样就可以保证交换的次数最少。

    参考代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        const int INF=1e9;
        int N;
        char c[41][41];//将矩阵保存到该字符数组
        int b[41];//表示第i行的1的最右边的位置
        int min=1;
        int sum=0;
        scanf("%d",&N);
        memset(b,0,sizeof(b));
        for(int i=0;i<N;i++){
            scanf("%s",c[i]);
        }
        //从每一行后面开始遍历找到每一行最后边的1
        for(int i=0;i<N;i++){
            for(int j=N-1;j>=0;j--){
                if(c[i][j]=='1'){
    
                    b[i]=j+1;
                    j=-1;
                };
            }
        }
    
        while(min<=N){
        for(int i=0;i<N;i++){
            if(b[i]<=min){
    
                if(i+1==min)
                    b[i]=INF;
                //输入矩阵的i+1行不满足下三角矩阵那么就找到满足的行,交换过来
                else{
                    for(int k=i;k>min-1;k--){
                        swap(b[k],b[k-1]);
                    }
    
                    b[min-1]=INF;
                    sum+=i-(min-1);
                }
                 min++;
                 break;
            }
        }
    
        }
        printf("%d
    ",sum);
        return 0;
    }
  • 相关阅读:
    Hive 常用的开窗函数
    常见的三类范式
    About A ROS driver for TCP/IP modems
    ROS Package for communication over TCP/IP.
    A repo of awesome papers about multi target multi camera tracking
    分布式锁
    http请求跳过ssl证书(Get请求示例)
    mysql和mogodb特殊字符转义
    全局异常捕捉
    Jasypt加密
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7454802.html
Copyright © 2020-2023  润新知