[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;
}