代码如下:
01.
#include<stdio.h>
02.
#include<string.h>
03.
#include<algorithm>
04.
using
namespace
std;
05.
int
map[1010][1010];
06.
int
f[1010];
07.
int
n,ans;
08.
void
search()
09.
{
10.
memset
(f,0,
sizeof
(f));
11.
for
(
int
i=1;i<=n;i++)
12.
for
(
int
j=n;j>=1;j--)
13.
{
14.
if
(map[i][j])
15.
{
16.
f[i]=j;
17.
break
;
18.
}
//f数组用来存每一行里面从右开始数第一个1的位置
19.
}
20.
ans=0;
21.
for
(
int
i=1;i<=n;i++)
//用两层for循环枚举所有的行找到列数小于行数的行的编号,然后交换
22.
{
23.
int
pos=0;
24.
for
(
int
j=i;j<=n;j++)
25.
{
26.
if
(f[j]<=i)
27.
{
28.
pos=j;
29.
break
;
30.
}
31.
}
32.
for
(
int
k=pos;k>i;k--)
33.
{
34.
swap(f[k],f[k-1]);
35.
ans++;
36.
}
37.
}
38.
39.
}
40.
int
main()
41.
{
42.
while
(
scanf
(
"%d"
,&n)!=EOF)
43.
{
44.
for
(
int
i=1;i<=n;i++)
45.
for
(
int
j=1;j<=n;j++)
46.
scanf
(
"%d"
,&map[i][j]);
47.
search();
48.
printf
(
"%d\n"
,ans);
49.
}
50.
return
0;
51.
}