目录

一,数字拼图——滑动

1,链接

2,游戏规则

3,术语

4,总状态数奇偶不变定理

5,判定——必要性

6,极小化

7,策略(化为子问题)

8,判定——充分性

9,OJ实战

SGU 139 Help Needed

二,数字拼图——旋转

三,数字拼图——轮换

四,纯色块拼图——旋转

五,物换星移

六,六边形纯色块拼图——旋转

七,纯色块拼图——轮换

八,移星掠形

练习模式

策略

比赛模式


一,数字拼图——滑动

1,链接

4399拼图游戏

或者我是最强大脑这个app中的数字华容道小游戏中的经典模式。

2,游戏规则

给你一个n(n>1)行m(m>1)列的矩阵,刚好由0,1,2。。。。。。n*m-1这n*m个数组成。

通过一系列的操作,使得矩阵变成如下状态(以下简称复原状态):

按照从上到下(一级排序),从左到右(二级排序)来排序,矩阵可以排成数列1,2,3,4。。。。。。n*m-2,n*m-1,0

操作只有1种,0和0的若干邻居(上下左右,最多4个邻居)中的某一个交换位置。

拼图游戏里面,0对应的格子是空的。

3,术语

逆序:

对于n个不同的元素,先规定个元素之间有一个“标准次序”(例如n个不同的自然数,可规定由小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就有1个“逆序”。点击打开百科词条

逆序数:

一个排列中所有逆序的总数叫做这个排列的“逆序数”。点击打开百科词条

曼哈顿距离:

固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。点击打开百科词条

总状态数:

逆序数是数列的一种状态数,曼哈顿距离是线段的一种状态数。

同样的,对于如上所说的n*m的矩阵,也可以定义总状态数。

总状态数=逆序数+0所在的格子到右下角的格子的曼哈顿距离(以下简称曼哈顿距离)。

4,总状态数奇偶不变定理

对于一个序列,每交换任意2个数,逆序数的奇偶性都会改变1次。

对于拼图游戏,每交换一次,曼哈顿距离的值都加1或者减1,所以奇偶性也会改变1次。

所以说,对于拼图游戏,总状态数的奇偶性是永远不变的。

5,判定——必要性

任何1个n*m的矩阵,是否都能移成复原状态呢?不一定。

首先,复原状态的总状态数的奇偶性可以算出来,曼哈顿距离为0,逆序数为n*m-1

所以总状态数的奇偶性就是n*m-1的奇偶性。

那么,对于任意给定的矩阵,很明显有的状态的奇偶性符合,有的却不符合。

根据总状态数奇偶不变定理,奇偶性不对的肯定无法复原,比如

这个状态的逆序数为15,曼哈顿距离为0,所以这个状态为奇,

而总状态数的奇偶性是3*5-1=14为偶,所以这个状态肯定无法复原。

有的状态是可以复原的,比如

这个状态的逆序数为14,曼哈顿距离为4,和为偶,经验证,这个状态是可以复原的。

说起来,这2个图就是上面的链接里面的4399游戏截图的,因为初始化比较慢,

而且还没初始化完就可以开始点了,于是我侥幸能得到这2张图。

那么,是不是只要状态的奇偶性对了,就一定可以复原呢?

这个值得思考,请继续看!

6,极小化

对于2*2的拼图,只有4!=24种状态。n=2,m=2,n*m-1=3

可以验证,有12种奇状态,全部可以复原,有12种偶状态,全部无法复原。

7,策略(化为子问题)

对于假设可以复原的状态,要怎么样复原呢?

第一,若 n>2,那么一定可以复原第一行,接下来只需要解决(n-1)*m 的子问题。

请注意,既然是子问题,那么第一行当然是永不再变,下同。

还请注意,因为加了这个限制,原问题有解不代表子问题同样有解。

第二,若m>2,那么一定可以复原第一列,接下来只需要解决 n*(m-1)的子问题。

第三,通过反复运用上述2条结论,最终一定可以只剩下右下角的4个格子,即2*2的子问题。

8,判定——充分性

如果一个状态的奇偶性和n*m-1的奇偶性相同,那么通过上述策略(七)化成2*2的子问题之后,

得到的状态的奇偶性和n*m-1的奇偶性仍然相同(四)。

根据(六),一定可以复原。

综上所述,当且仅当一个状态的奇偶性和n*m-1的奇偶性相同时,可以复原。

9,OJ实战

SGU 139 Help Needed

题目:

Description

Little Johnny likes puzzles a lot! Just a few days ago, he found out about the 'traditional' 4x4 puzzle. For this puzzle, you have all the numbers from 0 to 15 arranged in 4 rows and 4 columns. You are allowed to switch two adjacent elements (horizontally or vertically), only if one of them has the value 0. The purpose of the puzzle is to reach the following final state:

1  2   3   4 
                            5  6   7   8 
                            9  10  11  12 
                           13  14  15  0

Given the initial state of the puzzle, you have to decide whether there exists a sequence of moves which brings the puzzle into the final state.

Input

The input will consist of  4 lines, each of them containing 4 integers, describing the initial state of the puzzle.

Output

For every initial state, you should print "YES" if the final state can be reached after several moves or "NO", if such a thing is impossible.

Sample Input #1

1 2 3 4
5 6 7 8
9 10 11 0
13 14 15 12
Sample Output #1

YES
Sample Input #2

2 1 3 4
5 6 7 8
9 10 11 12
0 13 14 15
Sample Output #2

NO

这个题目是说,输入16个数,0-15,问你这样的状态能不能复原。

代码:

#include<iostream>
using namespace std;int list[16];int main()
{   int sum = 0;for (int i = 0; i < 16; i++){cin >> list[i];for (int j = 0; j < i; j++)if (list[j]>list[i])sum++;if (list[i] == 0)sum += i / 4 + i % 4;}if (sum % 2)cout << "YES";else cout << "NO";return 0;
}

二,数字拼图——旋转

数字华容道小游戏中的旋转模式

很容易把第一行和第一列搞定,关键是右下角四个怎么排序。

出现这种情况,需要把5和6反过来。显然只要知道怎么交换5和6,就能轻松应付所有情况了。

经过几次尝试,我把公式找出来了,左上的旋转按钮是不需要的,所以我把其他三个按钮分别叫做上左右。

公式就是上上左上右上上右右左右右右左右右右,这17个操作下来,就把5和6对换了,其他的不动。

对于更高阶的情况,都可以直接化成3*3的情况,方法和数字拼图——滑动的方法一样。

三,数字拼图——轮换

数字华容道小游戏中的联动模式。

(1)3*3

先把前2行弄好,最后一行一定是OK的,只要左右滑动即可。

(2)4*4

对于4*4的情况,很容易把前2行搞定,然后把下面2行的左边3列搞定。

唯一需要思考的就是,如何把相邻的2个对换位置。

很明显,只要知道如何交换这2个,就能轻松应付所有情况了。

方法一:

方法就是只滑动第三行和第四列,左上左左下左上右下右上左下左左 即可。

这个公式是我大学发明的,过去了好几年,不记得咋搞出来的了,估计是试出来的。

我在尝试推广到5*5时遇到了障碍,所以我研究了这个公式的本质,发现可以化简。

方法二:

我们只滑动第二行和第四列,左上右下下左上右上 即可。

(3)5*5

对于5*5的情况,不会出现只有2个是反着的情况,所以不需要公式。

(4)6*6

如果对第一行和第六列,左上右下下左上右上,相当于把第六列的中间四个循环往上挪了一格。

所以要想交换第六列的最下面2个块,公式是:

先对第四行第六列,左上右下下左上右,再对第二行第六列,左上右下下左上右上

四,纯色块拼图——旋转

这种纯粹就是数字拼图——旋转的简化版。

五,物换星移

4399在线play

和纯色块拼图——旋转差不多,但是差别在于目标不是整块整块的同色图形。

当然这还是给我们启示,尽量把简单的区域留到最后。

(17)

左边的是操作局面,右边的是目标局面。

先把第一行红色复原,再复原白色的。

(19)

先把上面2行复原

(21)

(26)

六,六边形纯色块拼图——旋转

各种数字旋转、色块旋转的puzzle都和魔方是类似的。

七,纯色块拼图——轮换

这种纯粹就是数字拼图——轮换的简化版。

方法也是一样的,对于3*3,先把第一行搞定,再把下面两行的左边两列搞定,最后把右下角2个块一交换即可。

对于5*5的,需要2次解决交换问题。

八,移星掠形

最强大脑同款项目。

练习模式

先调整上面两行

再调整最后一行就行了。

策略

首先注意到,移星掠形的难度是介于数字拼图和纯色块拼图之间的。

进一步地,有一个更准确的结论,移星掠形是数字拼图的退化,纯色块拼图是移星掠形的退化。

所以策略也是类似的,选一行或一列,把其他行或列完成,再完成选中行或列即可。

具体说来,选择最简单的行或列即可。简单的标准就是其中颜色重合程度更高。

比赛模式

简单

先把下面三行完成再完成第一行。

普通

困难

先把右边7列完成

最后只需要把第一列慢慢调整即可

puzzle(003)数字拼图、色块拼图相关推荐

  1. puzzle(0333)色块拼图、物换星移、移星掠形

    目录 一,纯色块拼图--旋转 二,物换星移 三,三角形纯色块拼图--旋转 2*2*2模式 3*3*3模式 四,六边形纯色块拼图--旋转 2*2*2模式 3*3*3模式 五,纯色块拼图--轮换 六,移星 ...

  2. 拼图登陆拼图二维码验证_另一个拼图观点

    拼图登陆拼图二维码验证 在过去的几周中,围绕Java 9即将发布及其最著名的功能:Java平台模块系统JPMS进行了激烈的辩论. –以其项目名称Jigsaw更为人所知. 模块系统以正式规范过程的形式引 ...

  3. 拼图登陆拼图二维码验证_如何使用拼图快速轻松地构建静态网站

    拼图登陆拼图二维码验证 by Rick West 由里克·韦斯特(Rick West) 如何使用拼图快速轻松地构建静态网站 (How to use Jigsaw to quickly and easi ...

  4. java课程设计拼图_java拼图游戏课程设计报告

    java拼图游戏课程设计报告 砾寸椒涩藕矾糯陋捕炬洁困喘港划舟逃豺涌锤芳喜胺递龚乏埔跺摩实阿信颊立蹲稿船纽臃瘪自康嘱脖究绢术拱虑犹犀棉宜炙转鸦半甘哨疗墓暑蛊渤幽峭咀豺虫拘召饭莽畜穗篷姿钟逻捞跨瀑拿丈土 ...

  5. 使用Vue做一个可自动拼图的拼图小游戏(二)

    背景以及最终效果 在上一篇文章中我们已经写完了一个可以正常玩的拼图小游戏,但是这还没有结束,我们还要接着试一下让拼图游戏可以自己完成拼图. 在线体验 本部分是这篇文章的第二部分,主要讲的是实现自动拼图 ...

  6. 使用Vue做一个可自动拼图的拼图小游戏(一)

    背景以及最终效果 随着几个项目的提测,也闲下来了,恰好玩了一把拼图游戏,于是突发奇想打算自己写一个试试. 在线体验 实现的功能有: 普通拼图的功能 自动拼图 本部分是这篇文章的第一部分,主要讲的是实现 ...

  7. java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?

    java 拼图 JDK 9发行日期推迟到2017年7月 距JDK 9发行不到200天,它又被推迟了 . 新的发布日期已更新为2017年7月,比之前推迟的日期晚了四个月. 推迟日期 9月13日,Orac ...

  8. java 拼图_拼图推迟将Java 9的发布日期推迟到2017年

    java 拼图 由于Project Jigsaw的延迟,Java 9的发布日期被推迟到2017年 由于项目延迟的悠久历史,这可能不足为奇,但是看起来备受期待的拼图项目已被延迟. 再次. 好消息是,与上 ...

  9. 如何判断无法到达目标的拼图_拼图项目的动机和目标

    如何判断无法到达目标的拼图 几周前,我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 . 那么我们得到什么回报呢? 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标. 系列 这篇文 ...

  10. 如何进行拼图?拼图其实很简单

    如何进行拼图?我们都知道微信一般只能发九图,当我们需要发布的图片超过九图,这个时候我们就需要把几张图片拼接在一起.可能很多小伙伴们还不清楚有哪些好用的拼图软件,这里小编就来给大家介绍几个好用的拼图软件 ...

最新文章

  1. php getconfig,PHP: tidy::getConfig - Manual
  2. 游击式(移动)开发的两种方式
  3. vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件...
  4. Bzoj 2127 happiness 最小割
  5. GDPR到底是如何影响机器学习的?
  6. CVPR2019 oral 目标跟踪算法之SiamRPN++
  7. 枚举算法:求解不等式
  8. Daily Scrum M2 11-19
  9. java阶段培训内容报告_周报告及Java学习笔记
  10. HTTrack 网站备份工具
  11. CMOS模拟电路设计经典书籍介绍 ---看完这些模电书,那离大佬就不远了
  12. Pikachu靶机系列之目录遍历、任意文件下载、敏感信息泄露、越权
  13. Google Guice @Inject注解的使用
  14. 服务器sel信息是什么意思,英特尔?服务器主板 — 如何解压和读取的服务器事件日志(SEL)...
  15. JavaSrcipt学习(学习打卡Day7)
  16. Java | MySQL Emoji表情写入数据库时报错问题解决,Incorrect string value: ‘\xF0\x9F\x98\x84\xF0\x9F...‘ for column
  17. 使用Echars实现水滴状、环形图、分割图、堆叠、组织架构图、地图轮廓等图表
  18. 樱桃键盘驱动在哪下_双十一这四款性价比樱桃轴机械键盘值得一看_搜狐汽车...
  19. 登录安全性 一天内连续输入密码错误3次,第二天才能登录(过了当天凌晨24点),实现原理
  20. 【C语言】取一个整数a从右端开始的4~7位

热门文章

  1. 9 款最好的免费博客网站对比
  2. Spring Boot——集成spring-boot-starter-mail发送163邮箱|QQ邮箱|Gmail邮箱邮件
  3. 一个查看贝塞尔曲线效果的网站
  4. Ubuntu18.04 笔记本电脑使用USB摄像头替代自带摄像头 安装摄像头驱动usb_cam的方法
  5. ASP.Net Core Web Api在Windows服务器上部署
  6. python爬虫时爬虫爬数据时出现“访问本页面,请开启JavaScript并刷新该页”
  7. 数据通信与网络有这一篇就够了(网络模型篇)
  8. 等保备案和通信网络单元定级备案的五大区别讲解
  9. 那些著名的黑客事件 六
  10. Ubuntu18.04 用一条命令 快速安装 FBReader