0 1 2

3 4 5

6 7 8

我们假设最大值为空白。即游戏时的样子是这样的:

0 1 2

3 4 5

6 7

但是不是所有的拼图都是有解的。

可解:

6 2 1

4 7 5

0 3 8

无解:

4 2 1

8 3 6

5 0 7

判断有解:

这里说下规律,设两个矩阵A和B。将矩阵从左到右,从上到下排成一个一维数组,设其逆序对的个数加上空白格在原矩阵所在的行列号之和P。若P(A)与P(B)的奇偶性相同,则两个矩阵可以通过拼图游戏进行转换。因此只要计算当前矩阵和正确矩阵的P值判断一下即可。

生成随机可解拼图游戏:

设拼图规模为n*m,用pt[n][m]表示,空白格位于pt[n-1][m-1]。

对于n*m的游戏,生成一个大小为n*m的一维数组data[n*m],空白格在data[n*m-1]。

则 p = n+m+con。其中con为data[0...n*m-2]的逆序对个数。

由于奇数+奇数=偶数,奇数+偶数=奇数,偶数+偶数=偶数,我们知道n+m的奇偶性,因此只要保证con的奇偶性即可。

随机生成data[0...n*m-2]。因为con(data[0...n*m-2])由con(data[0...n*m-4])和con(data[n*m-3...n*m=2])决定,而data[n*m-2]和data[n*m-3]的位置关系,不影响data[0...n*m-4]的奇偶性。

所以交换data[n*m-2]和data[n*m-3]会改变整个数据的逆序对个数的奇偶性。

因此只要根据随机生成的data,适当交换data[n*m-2]和data[n*m-3]的位置即可。。从这个规律也可以看出,随机的矩阵中只有一半是可解的。。

生成代码如下:

void getKeJiePingTu(int a[vol][col]){

int data[vol*col] = {0};

int maxnumber = vol*col-1;

for (int i=0;i

data[i] = i;

int replacei = rand()%(i+1);

int t = data[i];

data[i] = data[replacei];

data[replacei] = t;

}

data[maxnumber] = maxnumber;

//计?算?逆?序??对?数?y

int coverPairCount = 0;

for (int i=0;i

for (int j=i+1;j

if (data[i]>data[j])

coverPairCount++;

}

}

if ( (coverPairCount&1) == 1){

int t = data[maxnumber-1];

data[maxnumber-1] = data[maxnumber-2];

data[maxnumber-2] = t;

}

int index = 0;

for (int i=0;i

for (int j=0;j

a[i][j] = data[index++];

}

}

}

java 怎样判断拼图是否可还原_拼图游戏可解性判断,自动生成可解拼图相关推荐

  1. java拼图自动还原算法_自动解决智能拼图,A*算法+生成可解拼图(C++)

    [实例简介] 自动生成可解拼图问题,并用A*算法给出自动完成的步骤..另外还有暴力搜索的代码 [实例截图] [核心代码] pingtukejie └── pingtukejie ├── Release ...

  2. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  3. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  4. java汉字转换国标码_国标码(GB2312)的自动生成 | 学步园

    前面已提到,汉字是由两个字节构成的,每个字节占八位(8bits),那么每个汉字需要占十六位(16bits).而且由于中文字符的每个字节的最高位为1,则每个字节的ASCII码均大于127(27-1).这 ...

  5. 用java做小学数学系统_小学生数学练习题目自动生成系统——java课程设计

    <小学生数学练习题目自动生成系统--java课程设计>由会员分享,可在线阅读,更多相关<小学生数学练习题目自动生成系统--java课程设计(37页珍藏版)>请在金锄头文库上搜索 ...

  6. 如何用python自动改试卷_利用Python和Jinja2自动生成试卷

    一.概述 Jinja2是Python 3下一个被广泛应用的模版引擎,它的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能.其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能 ...

  7. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成...

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  8. mysql javabean 工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版)...

    TableGo_20200520 v6.9.0 正式版发布,此次版本更新如下: 1.新增对JDK9及以上版本Java环境的支持 2.生成JavaBean更名为生成数据模型并且提供了C#.C++.Gol ...

  9. JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...

    输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) ??做这道题实在没有思路参考了这位作者的代码: h ...

  10. java中class.forname连接mysql数据库_数据库链接与 Class.forName()用法详解

    主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...

最新文章

  1. php判断数组是否存在字符串中,php判断数组元素中是否存在某个字符串的方法
  2. linux添加磁盘后进入grub,从硬盘安装 Linux 和从 GRUB 命令行启动操作系统
  3. 流式处理框架storm浅析(下篇)
  4. <java并发编程实践>读书笔记一
  5. 删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)
  6. Python可视化库Matplotlib绘图入门详解
  7. mariadb mysql 5.6_MySQL / MariaDB 5.5 升级到 MySQL 5.6
  8. 小程序 const moment = require('moment')_小程序依赖分析实践
  9. Pandas to_bool
  10. Uva 10817 校长的烦恼
  11. 让nginx支持php
  12. Xcode 真机 iPhone is not available 及 is busy 解决
  13. java string对象,java中String对象
  14. [翻译].NET framework 4.0并行编程:入门
  15. mysql导入100000000需要多久_mysql做千万条压测数据
  16. Redis后门植入分析报告
  17. 超级全面的iOS资源
  18. js-合并两个有序数组
  19. python中字符串中文乱码_Python中文乱码的处理
  20. 汇编语言 masm5与debug命令使用方法 小结

热门文章

  1. 3D坦克大战游戏iOS源码
  2. PHP开发基础(一)
  3. 计算机中的right函数,excel的right函数的使用教程
  4. 短视频平台api接口php源码
  5. echarts图表销毁
  6. Obsidian基本使用
  7. xamp配置多域名站点
  8. jmeter+PerfMon Metrics Collector监控(ServerAgent)
  9. 短视频SDK用于旅游行业
  10. (个人笔记系列) Java基础语法