题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于lydrainbowcat<算法竞赛进阶指南>. 一.判定问题是否有解 我们可以由简至难看这样几个问题: 1. 描述   你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中.   例如:   5 2 8   1 3 _   4 6…
http://acm.hdu.edu.cn/showproblem.php?pid=6620 N数码问题: n*n矩阵,里面填着1—n*n-1,还有1个空格, 通过上下左右移动空格的位置, 使矩阵里的数升序排列,空格在右下角. 解的存在性判断结论: (上面的N=n*n-1) 将原矩阵从左上角开始展开成一个序列,计算该序列的逆序对数A 将目标矩阵同理计算逆序对数B 逆序对数的计算不包括空格 若n为奇数,A与B奇偶性相同则有解 若n为偶数,设原矩阵空格在第a行,目标矩阵空格在第b行,k=|a-b|…
题意:给定一个n*m的矩阵,其中不重复地填[0,n*m-1],问是否能通过有限步数将0移到右下角 n,m<=1e3 思路:结论题 当板子了 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<int,int> PII; typedef pair<l…
The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial intelligence. Along with chess, tic-tac-toe and backgammon, it has been used to study search algorithms. The Eight Puzzle can be generalized into an M × N…
先介绍八数码问题: 我们首先从经典的八数码问题入手,即对于八数码问题的任意一个排列是否有解?有解的条件是什么? 我在网上搜了半天,找到一个十分简洁的结论.八数码问题原始状态如下: 1 2 3 4 5 6 7 8 为了方便讨论,我们把它写成一维的形式,并以0代替空格位置.那么表示如下: 1 2 3 4 5 6 7 8 0 通过实验得知,以下状态是无解的(交换了前两个数字1 2): 2 1 3 4 5 6 7 8 0 八数码问题的有解无解的结论: 一个状态表示成一维的形式,求出除0之外所有数字的逆序…
x数码难题有解性判定: 只有必要性证明,没有充分性...... 还记得那个naive至极的八数码难题吗? 它回来了! 主要是借助逆序对这一神奇的手段: 考虑把x数码写成一排时的逆序对的奇偶性: 当你左右挪时显然没有影响. 当你上下挪时:列数为奇数则对逆序对奇偶性无影响,为偶数则变动. 然后我们就按照这个莫名其妙的法则A题......666 (注意:此法则不能容许有相同数字.否则奇偶性随机变化,无从下手) // poj 2893 #include <cstdio> #include <cs…
题意:给定M*N的数码图,问能否移动到最终状态 分析 有解的判定条件可见 八数码有解条件 值得一提的是,这道题求逆序对卡树状数组,只能用归并排序. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ; int n,m,pos,x,ans,zero; int seq[maxn],tmp[maxn]; void msort(int l,int r) //对seq进行排序 {…
理论基础 轮换与对换 概念:把 $S$ 中的元素 $i_1$ 变成 $i_2$,$i_2$ 变成 $i_3$ ... $i_k$ 又变成 $i_1$,并使 $S$ 中的其余元素保持不变的置换称为循环,又称轮换,记为 $(i_1, i_2,...,i_k)$,$k$ 称为循环长度,特别地,循环长度为2的循环称为对换. 定理: (1)任一置换可表示成若干个无公共元素的循环之积 (2)任一置换可表示成若干个对换之积,且对换个数的奇偶性不变. 八数码中的置换 若一个置换可以分解成奇数个对换之积称为奇置换…
                                                           M × N Puzzle Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 4112   Accepted: 1140 Description The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems…
The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了从初始到达当前状态的移动次数和上一个状态.初始化时候,当前状态移动次数为0,上一个状态为null,将其放入优先级队列,通过不断的从优先级队列中取出Seach Node去扩展下一级的状态,直到找到目标状态.对于优先级队列中优先级的定义我们可以采用:Hamming priority function 和…