题目大意:
给定一个由0和1组成的矩阵。只允许交换相邻的两行(第i行和第i+1行),要把矩阵化成下三角矩阵,最少需要交换几次?
Small
1<=N<=8
Large
1<=N<=40
找出每行在三角矩阵中应处的位置,移动到离它当前位置最近的行。
至于它应在的位置,判断该行最后一个出现1的位置即可
#include <iostream> #define MAX_N 45 using namespace std; int n; char M[MAX_N][MAX_N]; int a[MAX_N]; //a[i]表示第i行最后出现的1的位置 void solve(void) { int res=0; for(int i=0;i<n;i++) { a[i]=-1; //如果第i行不含1的话,记做 -1; for(int j=0;j<n;j++) if(M[i][j]=='1') a[i]=j; } for(int i=0;i<n;i++) { int pos= -1; //要移动到第i行的行 for(int j=i;j<n;j++) { if(a[j]<=i) { pos=j; break; } } for(int j=pos;j>i;j--) { swap(a[j],a[j-1]); res++; } } cout<<res<<endl; } int main() { int i; while(cin>>n) { for(i=0;i<n;i++) cin>>M[i]; solve(); } return 0; }