题目传送门

这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展。当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面、到达目标局面的最小步数

本文部分内容引用于lydrainbowcat《算法竞赛进阶指南》。

一、判定问题是否有解

我们可以由简至难看这样几个问题:

1.

描述
  你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中。
  例如:
  5 2 8
  1 3 _
  4 6 7
  在游戏过程中,可以把空格与其上、下、左、右四个方向之一的数字交换(如果存在)。
  例如在上例中,空格可与左、上、下面的数字交换,分别变成:
  5 2 8 5 2 _ 5 2 8
  1 _ 3 1 3 8 1 3 7
  4 6 7 4 6 7 4 6 _
   
  奇数码游戏是它的一个扩展,在一个n*n的网格中进行,其中n为奇数,1个空格和1~n*n-1这n*n-1个数恰好不重不漏地分布在n*n的网格中。
  空格移动的规则与八数码游戏相同,实际上,八数码就是一个n=3的奇数码游戏。
   
  现在给定两个奇数码游戏的局面,请判断是否存在一种移动空格的方式,使得其中一个局面可以变化到另一个局面。

奇数码问题两个问题可达,当且仅当他们网格中的数写成不含空格的序列后,两个序列的逆序对数的奇偶性相同。

(证明就不证了qwq)

2.

诸如此题,n*n的网格,只不过n是偶数。

这时候两局面可达当且仅当两序列的(逆序对数+两局面空格间行数差)的奇偶性相同

3.

扩展到n*m?

实际上对于是否有解关键的判定方法取决于列数。

当m为偶数 参考偶数码问题 求解

当n为偶数  参考奇数码问题 求解

本题就可以轻松愉悦地求解了==。

Code

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,pos,x,ans,zero;
int seq[],tmp[]; void msort(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
msort(l,mid);
msort(mid+,r);
int i=l,j=mid+,k=l-;
while(i<=mid&&j<=r)
{
if(seq[i]<=seq[j])
tmp[++k]=seq[i],i++;
else tmp[++k]=seq[j],j++,ans+=mid-i+;
}
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)!=EOF&&n!=)
{
if(n==) break;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&x);
if(x) seq[++pos]=x;
else zero=n-i;
}
msort(,pos);
if(m&)
zero=;
if((ans+zero)%==)
printf("YES\n");
else printf("NO\n");
ans=;pos=;zero=;
}
return ;
}

开始在主程序中调用msort(1,pos)时出锅了,写成了(1,n),这zz错误也是让我无话可说....。

二、求解最小步数

这类问题一般采用bfs解决,好像还有A*哈希的方法,可是我太菜了不会.....

例题1 Luogu P1379 八数码难题

例题2 Luogu P2730魔板【USACO Trianing】

这个其实是一种变体了qwq。

poj2893 M*N puzzle 【n*m数码问题小结】By cellur925的更多相关文章

  1. hdu 6620 Just an Old Puzzle(N数码问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=6620 N数码问题: n*n矩阵,里面填着1—n*n-1,还有1个空格, 通过上下左右移动空格的位置, 使矩阵里的 ...

  2. 【POJ2893&HDOJ6620】M × N Puzzle(n*m数码判定)

    题意:给定一个n*m的矩阵,其中不重复地填[0,n*m-1],问是否能通过有限步数将0移到右下角 n,m<=1e3 思路:结论题 当板子了 #include<bits/stdc++.h&g ...

  3. M × N Puzzle POJ - 2893(奇数码)

    The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial inte ...

  4. HDU 3600 Simple Puzzle 归并排序 N*N数码问题

    先介绍八数码问题: 我们首先从经典的八数码问题入手,即对于八数码问题的任意一个排列是否有解?有解的条件是什么? 我在网上搜了半天,找到一个十分简洁的结论.八数码问题原始状态如下: 1 2 3 4 5 ...

  5. poj2893 M×N puzzle

    x数码难题有解性判定: 只有必要性证明,没有充分性...... 还记得那个naive至极的八数码难题吗? 它回来了! 主要是借助逆序对这一神奇的手段: 考虑把x数码写成一排时的逆序对的奇偶性: 当你左 ...

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

    题意:给定M*N的数码图,问能否移动到最终状态 分析 有解的判定条件可见 八数码有解条件 值得一提的是,这道题求逆序对卡树状数组,只能用归并排序. #include<cstdio> #in ...

  7. 2019HDU多校第四场 Just an Old Puzzle ——八数码有解条件

    理论基础 轮换与对换 概念:把 $S$ 中的元素 $i_1$ 变成 $i_2$,$i_2$ 变成 $i_3$ ... $i_k$ 又变成 $i_1$,并使 $S$ 中的其余元素保持不变的置换称为循环, ...

  8. POJ 2893 M × N Puzzle(树状数组求逆序对)

                                                               M × N Puzzle Time Limit: 4000MS   Memory ...

  9. Programming Assignment 4: 8 Puzzle

    The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了 ...

随机推荐

  1. 【转载】一致性哈希算法(consistent hashing)

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  2. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

  3. [UnityShader3]溶解与重现效果

    參考链接:http://www.cnblogs.com/Esfog/p/DissolveShader.html 效果图: 从颜色变化来说,有三种,一种是纹理颜色.一种是纹理与黑边的混合颜色,一种是透明 ...

  4. js对象的属性问题

    ES6之前js的对象的属性只能是字符串, <html> <head> <script type="text/javascript"> var a ...

  5. ACM在线题库

    现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO http://ace.delos.com/u ...

  6. Get Luffy Out (poj 2723 二分+2-SAT)

    Language: Default Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7969   ...

  7. mysql表分区 partition

    表分区 partition 当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低. 可不可以把表的数据分开在几张表上? 1: 从业务角度可以解决.. (分表,水平 ...

  8. ap和路由器有什么区别 ap和路由器的区别介绍【图文】

    现在能够摆脱网线限制能够自由方便上网的WiFi和无线网络也来越流行,很多酒店.饭店.宾馆.办公楼等地方都会提供无线网络.而能够提供无线网络的设备有很多,现在我们介绍的是无线ap和无线路由器.那么,ap ...

  9. SpringBoot使用logback日志记录

    在resources里的配置文件: logback-spring.xml <?xml version="1.0" encoding="UTF-8" ?&g ...

  10. HBase集群出现NotServingRegionException问题的排查及解决方法

    HBase集群在读写过程中,可能由于Region Split或Region Blance等导致Region的短暂下线,此时客户端与HBase集群进行RPC操作时会抛出NotServingRegionE ...