NYOJ-858下三角矩阵

下三角矩阵

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

给定一个由0和1组成的矩阵。只允许交换相邻的两行,要把矩阵转化成下三角矩阵(主对角线上方的元素都是0),最少需要交换几次?输入的矩阵保证总能转化成下三角矩阵。

输入
多组测试数据。
每组测试数据第一行为一个整数n(1 <= n < 1000),表示矩阵的大小为n*n;
接下来n行,每行有n个数表示这个矩阵。
输出
输出最小需要交换的次数,单独占一行。
样例输入
3
0 0 1
1 0 0
0 1 0
样例输出
2

思路:先记录第i行最后一个1的列(位置)num[i],然后从第一行起,for i 1->end,for j i-->end,有num[j]<=i,从第j行起依次与前面的行交换顺序,到第i行为止

同时记录交换次数j-i,和即为最小的次数

#include <stdio.h> 
#include <string.h>
int a[999][999];
int num[999];
int main()
{
    
    int n,i,j,pos,ans;
    while(~scanf("%d",&n)) 
    {
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
                scanf("%d",&a[i][j]);
            }
        memset(num,0,sizeof(n));//默认的列为0 
        //确定最后一个1的列
        for(i=0;i<n;i++)
            for(j=n-1;j>=0;j--)
            {
                if(a[i][j])
                {
                    num[i] = j;
                    break;//一定要break 
                }
            }
        ans = 0;//计算每组数据交换次数之前都初始化为0 
        //从第一行开始移动
        for(i=0;i<n;i++)
        {
            for(j=i;j<n;j++)
            {
                if(num[j] <= i)//要发生交换 
                {
                    pos = j;
                    break;
                }
            }
            for(j=pos;j>i;j--)
            {
                num[j-1] = num[j] - num[j-1] + (num[j] = num[j-1]);
            }
            if(pos > i)//表示有交换 
                ans += (pos-i);
        } 
        printf("%d
",ans);
    }
    return 0;
}        

 参照:http://blog.csdn.net/lyhvoyage/article/details/12906277

原文地址:https://www.cnblogs.com/emptyCoder/p/5341789.html