[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;
} 
发布了63 篇原创文章 · 获赞 8 · 访问量 7188

猜你喜欢

转载自blog.csdn.net/s1547156325/article/details/104677747
今日推荐