题目大意:

给定一个由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;
}