题目传送门

这个问题是来源于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. wxWidgets刚開始学习的人导引(6)——wxWidgets学习材料清单

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  2. Android自己定义圆角ImageView

    我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...

  3. IOS 获取设备本地音视频

    1.检索音视频 PHFetchOptions *allPhotosOptions; @property (nonatomic, strong) PHFetchResult *assetsFetchRe ...

  4. SQL面试练习(MySql)

    创建测试数据库: /*如果已经存在此数据库,先删除*/ drop database if exists sqltest ; /*创建并设置编码为UTF-8*/ create database sqlt ...

  5. nyoj 题目10 skiing —— 南阳oj

    题目信息例如以下: skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...

  6. 【2】按照Django官网,创建一个web app 创建app/创建相应的数据库表

    1. Creating app $ python manage.py startapp polls That'll create a directory polls, which is laid ou ...

  7. log Configuration

    Log4j – Configuring Log4j 2 - Apache Log4j 2 https://logging.apache.org/log4j/2.x/manual/configurati ...

  8. Sublime Text web开发神器

    开发工具介绍 开发工具一般分为两种类型:文本编辑器和集成开发环境(IDE) 常用的文本编辑器:Sublime Text.Notepad++.EditPlus等 常用的IDE:WebStorm.Inte ...

  9. RubyMine安装、破解

    经常安装东西,这是我安装过最快的ide破解版. 下载地址: http://www.jetbrains.com/ruby/download/index.html 破解序列号: name: rubymin ...

  10. 关于在PHP中当一个请求未完成时,再发起另一个请求被阻塞的问题

    最近做项目的时候遇到个问题,就是做阿里云oss大文件上传进度条显示,因为要实时查询上传分片进度,所以在上传的同时必须要再发起查询的请求,但是一直都是所有分片上传完成后查询的请求才执行,刚开始以为是阿里 ...