POJ 2893 M × N Puzzle——八数码有解条件

POJ 2893 M × N Puzzle——八数码有解条件,第1张

概述题意:给定M*N的数码图,问能否移动到最终状态 分析 有解的判定条件可见 八数码有解条件 值得一提的是,这道题求逆序对卡树状数组,只能用归并排序。 #include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 1e6 + 10;int n,m,pos,x,an

题意:给定M*N的数码图,问能否移动到最终状态

分析

有解的判定条件可见 八数码有解条件

值得一提的是,这道题求逆序对卡树状数组,只能用归并排序。

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 1e6 + 10;int n,m,pos,x,ans,zero;int seq[maxn],tmp[maxn];voID msort(int l,int r)  //对seq进行排序{    if(l==r) return ;    int mID=(l+r)>>1;    msort(l,mID);    msort(mID+1,r);    int i=l,j=mID+1,k=l-1;    while(i<=mID&&j<=r)    {        if(seq[i]<=seq[j])            tmp[++k]=seq[i],i++;        else tmp[++k]=seq[j],j++,ans+=mID-i+1;  //ans就是逆序对个数    }    while(i<=mID)        tmp[++k]=seq[i],i++;    while(j<=r)        tmp[++k]=seq[j],j++;    for(int qwq=l;qwq<=r;qwq++)        seq[qwq]=tmp[qwq];}int main(){    while(scanf("%d%d",&n,&m)==2 && m)    {        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)            {                scanf("%d",&x);                if(x) seq[++pos]=x;                else zero=n-i;            }        msort(1,pos);        if(m&1)  zero=0;        if((ans+zero)%2==0)  printf("YES\n");        else printf("NO\n");        ans=0;pos=0;zero=0;    }    return 0;}

 

 

参考链接:https://www.cnblogs.com/nopartyfoucaodong/p/9673434.html

总结

以上是内存溢出为你收集整理的POJ 2893 M × N Puzzle——八数码有解条件全部内容,希望文章能够帮你解决POJ 2893 M × N Puzzle——八数码有解条件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存