最先想到的是尝试所有N!种交换方式,但是时间复杂度不行
package 数字技巧实战;
import java.util.Scanner;
public class CrazyRows {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] m=new int[n][n];
for(int i=0;i<n;i++){
String s=sc.next();
for(int j=0;j<s.length();j++)
m[i][j]=s.charAt(j)-'0';
}
//for(int i=0;i<n;i++)
//for(int j=0;j<n;j++)
//System.out.print(m[i][j]+" ");
int[] a=new int[n];//a[i]表示第i行最后出现的1的位置1-n-1
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--){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
res++;
}
}
System.out.println(res);
}
}