• 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

  • 相关阅读:
    线程池。
    等待唤醒机制。
    第一册:lesson 131.
    线程同步机制。
    第一册: lesson 129。
    线程实现方式。
    第一册:lesson 125.
    第一册:Lesson 123.
    黄渤的谈话。
    K3 KFO 手册
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5341789.html
Copyright © 2020-2023  润新知