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\n",sum);
    return 0;
}

 

posted @ 2017-08-30 18:52  路人姜。  阅读(258)  评论(0编辑  收藏  举报