标签:相同 += print 偶数 namespace -- for bit main
\(N*M\)数码某局面到达另一局面的可行性判定
可以通过逆序对个数的奇偶性是否相同来判定。
我们将这\(N*M-1\)个数写成一列来看。
行为偶数时,同上。
Source Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int x=0,f=1;char ch=‘ ‘;
while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch<=‘9‘&&ch>=‘0‘){x=(x<<3)+(x<<1)+(ch^‘0‘);ch=getchar();}
return x*f;
}
const int N = 1000 + 2;
int n,m;
int a[N*N],tot;
int tr[N*N];
int lowbit(int x){
return x&-x;
}
void modify(int p,int k){
for(int i=p;i<=tot;i+=lowbit(i)){
tr[i]+=k;
}
}
int query(int p){
int ans=0;
for(int i=p;i;i-=lowbit(i)){
ans+=tr[i];
}
return ans;
}
int main(){
// freopen("data.in","r",stdin);
// freopen("sol.out","w",stdout);
while(1){
n=read();m=read();
if(!n&&!m) break;
memset(tr,0,sizeof(tr));
tot=0;int pos;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x;x=read();
if(x) a[++tot]=x;
else pos=i;
}
}
int mul=n*m;
int ans=0;
for(int i=tot;i;i--){
ans+=query(a[i]-1);
modify(a[i],1);
}
if(m%2==0){
ans+=n-pos;
}
if(ans%2==0) printf("YES\n");
else printf("NO\n");
}
return 0;
}
M × N Puzzle - 逆序对【N*M数码问题局面之间可达性判定】
标签:相同 += print 偶数 namespace -- for bit main
原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9785056.html