题目大意:
给定一个由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;
}
天下武功,唯快不破
浙公网安备 33010602011771号