题意:n数码是否有解
题解:如果n为奇数,逆序数对如果跟n同奇则不行。如果n为偶数,就得判断0的行数到目标行的距离是否是同奇同偶
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(s) memset(s, 0, sizeof(s))
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
int a[maxn],N;
ll c[maxn];
int lowbit(int x){
return x&(-x);
}
void update(int x,int d){
while(x<=N){
c[x]+=d;
x+=lowbit(x);
}
}
ll query(int x){
ll sum=0;
while(x>0){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n){
int dis,cnt=0;N=n*n-1;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int tmp;
scanf("%d",&tmp);
if(tmp==0)dis=n-i;
else a[++cnt]=tmp;
}
}
ll sum=0;
for(int i=1;i<=cnt;i++){
update(a[i],1);
sum+=i-query(a[i]);
}
if(n%2==1){
if(sum%2==0)puts("YES");
else puts("NO");
}else {
if((sum%2==0&&dis%2==0)||(sum%2==1&&dis%2==1))
puts("YES");
else puts("NO");
}
}
return 0;
}