[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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值