[C++]Crazy Rows
Crazy Rows:
给定一个由0和1组成的矩阵.只允许交换相邻的两行(第i行和第i+1行),要把矩阵化成下三角矩阵(主对角线上方的元素都为0),最少需要交换几次?输入的矩阵总能化成下三角矩阵。
输入格式:
n为矩阵行列数
接下来n行为矩阵元素
输出格式:
最少交换的次数
输入:
2
1 0
1 1
输出:
0
输入:
3
0 0 1
1 0 0
0 1 0
输出:
2
解题思路:如果对矩阵中的每一个元素来检索比较的话,复杂度会很大。我们可以看看下三角矩阵的特点,1都在左下方,且一行最后一个1所在的列数越小,那么这行就越在上面。并且这一题保证输入可以成为下三角矩阵。那么,我们就可以只关注每行最后一个一所在的位置。这个位置越靠前,那行数需要越靠前。
确定第一行后,就只需要管下面的行数了,然后之后的行都可以用这个思路。
听起来就像手机拼图游戏一样0.0
#include<iostream>
using namespace std;
const int maxn = 44;
int n;
int a[maxn][maxn];
int ans[maxn];
int main(){
cin>>n;
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
cin>>a[i][j];
}
}
for(int i = 0; i<n; i++){
ans[i] = -1;
for(int j = 0; j<n; j++){
if(a[i][j] == 1) ans[i] = j;
}
}
int res = 0;
for(int i = 0; i<n; i++){
int pos = -1;
for(int j = i; j<n; j++){
if(ans[j] <= i){
pos = j;
break;
}
}
for(int j = pos; j>i; j--){
int t = ans[j];
ans[j] = ans[j-1];
ans[j-1] = t;
res++;
}
}
cout<<res<<endl;
return 0;
}