19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)

题目链接
HDU 6620
http://acm.hdu.edu.cn/showproblem.php?pid=6620
参考来源
百度文库上有一篇文章,讲的就是4 * 4智力拼图,看完就完全懂了。
大家可以先看百度文库的这篇文章,然后就不用看我这篇了能更好的理解我这篇文章。
https://wenku.baidu.com/view/a8c4fad533d4b14e85246856.html

题意

给你一个4 * 4的智力拼图,问能不能在120步内把它拼好。

思路

以前手机还是按键机的时候,手机上有这种游戏,很喜欢(其实是贪吃蛇玩腻了 )。当时在玩不是按公式玩的,那样多没意思(其实是蠢,没想到有公式一说要是当时给我知道了,我肯定刷记录 )。

这道题目并不需要你用最少的步数把图片拼好,实际上一张能够复原的 4 * 4 的智力拼图,在八十步内一定能够复原好。我们答案不可能全都输出Yes , 因为给出的图不一定可以复原

以前在玩的时候,有遇到过其他图片的位置正确,唯独有两张图片各自占了对方的位置。这是就是无解的图(当时我玩的那款还没有判别是否是错图的功能)。例如这样:
19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)_第1张图片
也就是说我们要判断的不是120步内有没有解,而是拼图本身有没有解。(如果一个图是由一个错误的图(无法还原成有序)打乱的,那么它肯定120步内无法拼好)

所以问题转换为:给出的拼图是否是错图?

19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)_第2张图片
19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)_第3张图片
19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)_第4张图片
19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对)_第5张图片
最关键的一句话是:在思维拼图中,移动就是数字16(也就是空白)与它上下左右四个位置的数字进行交换。容易证明,无论16与哪个位置上的数字进行交换,总的逆序和增加或者减少的数量都是奇数。

详细解释可以看这篇文章:拼图可解的充要条件
https://www.cnblogs.com/weiyinfu/p/5911340.html

操作与奇偶性的关系有两种:
首先不管哪种图,左右交换始终不影响逆序数的奇偶性。
(1)列数为奇数,上下交换不影响奇偶性;
(2)列数为偶数,上下交换影响奇偶性.

如果列数为奇数,状态逆序数的奇偶性守恒.
如果列数为偶数,状态逆序数的奇偶性 ^ 空位状态的奇偶性守恒.

题目思路

这道题给的图列数恒为4,是偶数,所以我们的空格如果上下每交换一次,必定会导致逆序数的奇偶性发生改变。

代码

#include
#include
const int maxn = 1e5 + 5;
typedef long long ll;
using namespace std;
int g[5][5];
int a[20];
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int cnt = 0;
        int pos = 0;
        for(int i = 0; i < 4; ++i)
        {
            for(int j = 0; j < 4; ++j)
            {
                scanf("%d", &g[i][j]);
                if(g[i][j] != 0)
                    a[cnt++] = g[i][j];
                else
                    pos = i;
            }
        }
        
        cnt = 0;
        for(int i = 0 ; i < 15; ++i)//计算逆序数的个数
            for(int j = i + 1; j < 15; ++j)
                if(a[j] < a[i])
                    cnt++;

        if((((3 - pos) % 2) ^ (cnt % 2)) == 0)//看行数差的奇偶性与逆序数的奇偶性是否同奇偶性
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

你可能感兴趣的:(19杭电暑假多校 第四场 1007 Just an Old Puzzle (思维/逆序对))