poj2893 M*N puzzle 【n*m数码问题小结】By cellur925
这个问题是来源于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的更多相关文章
- hdu 6620 Just an Old Puzzle(N数码问题)
http://acm.hdu.edu.cn/showproblem.php?pid=6620 N数码问题: n*n矩阵,里面填着1—n*n-1,还有1个空格, 通过上下左右移动空格的位置, 使矩阵里的 ...
- 【POJ2893&HDOJ6620】M × N Puzzle(n*m数码判定)
题意:给定一个n*m的矩阵,其中不重复地填[0,n*m-1],问是否能通过有限步数将0移到右下角 n,m<=1e3 思路:结论题 当板子了 #include<bits/stdc++.h&g ...
- M × N Puzzle POJ - 2893(奇数码)
The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial inte ...
- HDU 3600 Simple Puzzle 归并排序 N*N数码问题
先介绍八数码问题: 我们首先从经典的八数码问题入手,即对于八数码问题的任意一个排列是否有解?有解的条件是什么? 我在网上搜了半天,找到一个十分简洁的结论.八数码问题原始状态如下: 1 2 3 4 5 ...
- poj2893 M×N puzzle
x数码难题有解性判定: 只有必要性证明,没有充分性...... 还记得那个naive至极的八数码难题吗? 它回来了! 主要是借助逆序对这一神奇的手段: 考虑把x数码写成一排时的逆序对的奇偶性: 当你左 ...
- POJ 2893 M × N Puzzle——八数码有解条件
题意:给定M*N的数码图,问能否移动到最终状态 分析 有解的判定条件可见 八数码有解条件 值得一提的是,这道题求逆序对卡树状数组,只能用归并排序. #include<cstdio> #in ...
- 2019HDU多校第四场 Just an Old Puzzle ——八数码有解条件
理论基础 轮换与对换 概念:把 $S$ 中的元素 $i_1$ 变成 $i_2$,$i_2$ 变成 $i_3$ ... $i_k$ 又变成 $i_1$,并使 $S$ 中的其余元素保持不变的置换称为循环, ...
- POJ 2893 M × N Puzzle(树状数组求逆序对)
M × N Puzzle Time Limit: 4000MS Memory ...
- Programming Assignment 4: 8 Puzzle
The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了 ...
随机推荐
- Android Dynamic Action(动态Action)—像访问网页一样地访问Activity
Android Dynamic Action,简称DA,是一种简便.可变Action的实现方案.DA框架的初衷是为了取代Context.startActivity的调用方式,使用建造者模式(Build ...
- Class.forName("java.lang.String")的作用?
返回字节码: 返回的方式有2种: 第一种是这个类的字节码已经加载到内存里面来了,现在想要取到它的字节码,我直接找到那份字节码把他返回: 第二种是我去得到这个类的字节码,结果在虚拟机里面还没有这个类的字 ...
- 在线安装Ganglia3.6.0,nginx+php搭建gweb,绝对通过
环境:CentOS6.5 minimal 目标:安装Ganglia核心组件(gmond, gmetad, gmetric, gstat, libganglia).Ganglia web 准备 yum增 ...
- 深度学习入门-4.1 AND.py 源码分析
源代码 ------------------------------------------------------------------------------------------------ ...
- PM12条
PM首先是用户 站在用户角度看待问题 用户体验是一个完整的过程 追求效果,不做没用的东西 发现需求,而不是创造需求 决定不做什么,往往比决定做什么更重要 用户是很难被教育的,要迎合用户,而不是改变用户 ...
- vue中导出Excel表格
项目中我们可能会碰到导出Excel文件的需求,一般后台管理系统中居多,将table中展示的数据导出保存到本地.当然我们也可以通过一些处理来修改要导出的数据格式,具体需求具体对待. 1.首先我们需要安装 ...
- Scrapy运行报错:ModuleNotFoundError: No module named 'douban.douban'
运行scrapy爬虫报错: from douban.douban.items import DoubanItem ModuleNotFoundError: No module named 'douba ...
- POJ - 1236 Network of Schools(有向图的强连通分量)
d.各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输, 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 问题2:至少需要添加几条传输线 ...
- 「NOI2004」「LuoguP1486」郁闷的出纳员
Descrption OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调 ...
- 【SDOI2009】SuperGCD
[题目链接] 点击打开链接 [算法] 1.关于求最大公约数的算法 若使用辗转相除法,那么显然会超时 不妨这样思考 : 要求gcd(a,b), 若a为偶数,b为偶数,则gcd(a,b) = 2 * gc ...