下三角矩阵
时间限制: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