[C++]Crazy Rows

[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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章