zoukankan      html  css  js  c++  java
  • GCJ Crazy Rows

    题目大意:

    给定一个由0和1组成的矩阵。只允许交换相邻的两行(第i行和第i+1行),要把矩阵化成下三角矩阵,最少需要交换几次?

    Small

    1<=N<=8

    Large

    1<=N<=40


    找出每行在三角矩阵中应处的位置,移动到离它当前位置最近的行。

    至于它应在的位置,判断该行最后一个出现1的位置即可


    #include <iostream>
    #define MAX_N 45
    using namespace std;
    int n;
    char M[MAX_N][MAX_N];
    int a[MAX_N];       //a[i]表示第i行最后出现的1的位置
    
    void solve(void)
    {
        int res=0;
        for(int i=0;i<n;i++)
        {
            a[i]=-1;            //如果第i行不含1的话,记做 -1;
            for(int j=0;j<n;j++)
                if(M[i][j]=='1')
                    a[i]=j;
        }
        for(int i=0;i<n;i++)
        {
            int pos= -1;    //要移动到第i行的行
            for(int j=i;j<n;j++)
            {
                if(a[j]<=i)
                {
                    pos=j;
                    break;
                }
            }
    
            for(int j=pos;j>i;j--)
            {
                swap(a[j],a[j-1]);
                res++;
            }
    
        }
        cout<<res<<endl;
    }
    
    int main()
    {
        int i;
        while(cin>>n)
        {
            for(i=0;i<n;i++)
                cin>>M[i];
            solve();
    
        }
    
        return 0;
    }


  • 相关阅读:
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
    期末作业验收
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/frankM/p/4399487.html
Copyright © 2011-2022 走看看