以前自己写过搜索华容道的最优解程序,想起来真是效率感人>﹏<,虽然如此,但是全是自己独立完成的,心里还是很高兴的,现在在微信小程序中看到了华容道,决定要再写一次华容道的程序。
这次看了网上的华容道程序,修改自许剑伟先生(福建莆田第十中学)的华容道程序(又是C语言,又是不友好的变量命名,看得我好辛苦≡(▔﹏▔)≡)
程序支持棋子三种移动类型

  1. 同一颗棋子为一步
  2. 直线为一步
  3. 一格为一步

    目录

    • 盘面分析
      • 基本样本
      • 示例
    • 感知哈希算法
      • 1. 缩小图片尺寸
      • 2.转为灰度图片
      • 3.计算平均值
      • 4.比较像素的灰度
      • 5.计算hash值
    • 代码

盘面分析

这一步是将图片转为数组盘面,以前是采用取特定的点的颜色,确定棋子的类型,效果不是很好,这次使用的是图片相识算法,用了最简单的图片感知算法,效果非常好,也是因为图片比较简单的关系

基本样本

基本样本来源,包含了所有的横、竖棋子

 private final static String[][] HASH_CODE = {// 兵{"3878EEDACB8BBEA1", "387CCEDACA8BBEA1", "387CCADACA8BBEA1", "387CEADACA8BBEA1", "3878D6DACBC9BE81","3858D2DACBC9BE81", "3878D6DACB89BEA1", "387CD2DACBC9BEA1"},// 横将{"F9FAFB71238283C1", "030200E1F7F5F3FB", "0F0C1199E3E2F7E7", "F7F2F9F8FB720B09", "F9F9FBF3E3E1E0C0"},// 竖将{"C793BB9CB05C2E13", "7F7FFBB5980182AE", "EFF72707278DCDDB", "6EB79B075842073B", "DB91ADA1986E7E2A"},// 曹操{"E082810E04008FCF"}};

示例


10,  1,  5,  5,
10, 15, 15,  0,
11, 15, 15, 12,
11,  0, 13, 12,2,  3, 13,  4

感知哈希算法

1. 缩小图片尺寸

这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息

2.转为灰度图片

简化色彩
1,2步直接使用下面代码完成

 BufferedImage part = new BufferedImage(8, 8, BufferedImage.TYPE_BYTE_GRAY);

3.计算平均值

计算所有像素的灰度平均值

 /*** 计算数组平均值* @param rgb* @return*/public static double average(int[] rgb) {double sum = 0;for (int i = 0; i < rgb.length; i++) {sum += rgb[i];}return sum / rgb.length;}

4.比较像素的灰度

将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0

    private static int[] rgbToBinariesHashCode(int[] rgb) {int[] hashCode = new int[rgb.length];double average = KlotskiNodeUtil.average(rgb);for (int i = 0; i < rgb.length; i++) {if (rgb[i] >= average) {hashCode[i] = 1;}}return hashCode;}/*** 二进制数组转16进制字符* @param binaries* @return*/public static String binariesToHex(int[] binaries) {char[] hashCode = new char[binaries.length >> 2];for (int i = 0, j = 0; i < binaries.length; i += 4, j++) {int sum = (binaries[i] << 3) + (binaries[i + 1] << 2) + (binaries[i + 2] << 1) + binaries[i + 3];switch (sum) {case 0:hashCode[j] = '0';break;case 1:hashCode[j] = '1';break;case 2:hashCode[j] = '2';break;case 3:hashCode[j] = '3';break;case 4:hashCode[j] = '4';break;case 5:hashCode[j] = '5';break;case 6:hashCode[j] = '6';break;case 7:hashCode[j] = '7';break;case 8:hashCode[j] = '8';break;case 9:hashCode[j] = '9';break;case 10:hashCode[j] = 'A';break;case 11:hashCode[j] = 'B';break;case 12:hashCode[j] = 'C';break;case 13:hashCode[j] = 'D';break;case 14:hashCode[j] = 'E';break;case 15:hashCode[j] = 'F';break;default:}}return String.valueOf(hashCode);}

5.计算hash值

将上一步的比较结果,组合在一起,就构成了一个64位的整数(转16进制),这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了
得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算”汉明距离”(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片

    private final static char[] INDEX_TO_CHAR_TYPE = {KlotskiNodeUtil.E, KlotskiNodeUtil.S,KlotskiNodeUtil.H, KlotskiNodeUtil.V, KlotskiNodeUtil.T};/*** 汉明距离* @param hashCode* @return*/private static char hanMingDifference(String hashCode) {int difference = 16, index = 0;for (int i = 0; i < HASH_CODE.length; i++) {for (int j = 0; j < HASH_CODE[i].length; j++) {int count = 0;for (int k = 0; k < HASH_CODE[i][j].length(); k++) {if (HASH_CODE[i][j].charAt(k) != hashCode.charAt(k)) {count++;}}// 取最近接近的棋子类型if (count < 10 && count < difference) {index = i + 1;difference = count;}}}return INDEX_TO_CHAR_TYPE[index];}

代码

GitHub

微信小程序华容道最优解相关推荐

  1. 腾讯位置服务+微信小程序,一文告诉你程序员为什么不会坐过站!

    引言 1.1「腾讯位置服务」是什么? 立足生态,连接未来 腾讯位置服务平台依托庞大的数据生态,以定位.地图展示.地点搜索.路线规划.导航.室内图.海外图等位置服务能力和LBS大数据能力为基础,面向开发 ...

  2. 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?

    你好,我是俊鹏,今天是第一节课,我想和你聊一聊微信小程序表层知识中的双线程模型.主要探讨一下它的技术背景.线程间的分工和通信模式. 在工作以及一些技术分享中,我经常被人问到这样一个问题:"微 ...

  3. [Web] [微信小程序-云开发] 商城 无服务器 加后台管理

    [Web] [微信小程序-云开发] 商城 无服务器 加后台管理 说明: 目前云开发仅针对认证后的公众号使用(每年300的费用那个) wxapp-mall-clouddb 前言 如何使用 更多说明 功能 ...

  4. 微信小程序开发13 云开发:云原生一体化应用开发平台

    你好,我是冠宇,从这个模块开始,就由我带着你一起学习. 在开篇词中,俊鹏讲到云开发诞生的背后动力是困扰前端开发者们的一个核心问题:对后端的依赖.那云开发到底怎么去优化和解决这个问题的呢? 这就是我们今 ...

  5. 微信小程序开发04 性能优化:借助微信开发者工具提升小程序性能

    你好,我是周俊鹏. 前几节课我们分别从架构层(双线程模型).链路层(授权模型).和应用层(自定义组件)三个角度学习了小程序的技术要点.它们能帮你完成一个微信小程序的基本业务逻辑和交互逻辑. 逻辑的第一 ...

  6. 手把手教你开发人工智能微信小程序(1):线性回归模型

    谈到人工智能.机器学习,我们可能会觉得很神秘,其实机器学习背后的理论并不复杂.就如同原子弹这么尖端的科技,其背后的理论就是一个很简单的公式: E = mc² 机器学习的最基础理论其实也不复杂,本文先尝 ...

  7. 微信小程序 最强连一连攻略 程序自动玩

    微信小程序 最强连一连攻略 程序自动玩 步骤 1.截屏 2.分析游戏状态 3.搜索 4.自动触摸滑动过关路径 代码 测试结果 注意 步骤 程序将手动玩游戏的过程分四步完成 1.截屏 将手机屏幕截屏保存 ...

  8. Finclip车载小程序提供最优解决方案

    智能化.网联化已经成为未来汽车产业的发展趋势之一,车联网也从最初的车机系统扩展到整车的数字化,"互联网汽车"概念深入人心. 但随着车联网产业快速发展的同时,挑战和问题也随之而来. ...

  9. 微信小程序合集zip

    ChatGPT小程序搭建 小狐狸ChatGPT付费创作系统V2.1.3     Chat GPT分销版 工具类 星座和生肖运势分析&配对小程序,周公解梦,王者荣耀战力查询,趣味表情生成.壁纸小 ...

最新文章

  1. 最全 Prometheus 踩坑集锦
  2. Java对二叉树的操作
  3. asp.net中获得客户端的IP地址
  4. Chapter7-4_來自獵人暗黑大陸的模型 GPT-3
  5. 前端笔记-vue cli中v-bind动态数据实时更新
  6. java hashmap
  7. heartbeat+DRBD+mysql高可用集群实战
  8. AjaxPro.NET实现TextBox智能获取服务端数据功能(Asp.net 2.0)(示例代码下载)
  9. 海信LINUX系统改安卓,如何获取海信电视的root许可一键单击海信Smart TV的root卸载内置软件...
  10. RCC_APB2Periph_AFIO时钟一般在什么时候下需要开启?
  11. 专访:6位飞桨开发者的「新生代」AI创新故事!
  12. Jenkins用户权限
  13. 利用Regsvr32绕过Applocker的限制策略
  14. LINQ的Order By (Descending) 操作
  15. 《上古天真论》第五讲文字版
  16. 按光在光纤中的传输模式可将光纤分为单模光纤和多模光纤两种
  17. 程序员为何很难与他人沟通
  18. 火影T7C笔记本Win11重装Win10系统方法分享
  19. Crowd Counting论文小结(持续更新)
  20. 如何制作一个自定义的winpe?

热门文章

  1. SpringBoot - @InitBinder注解详解
  2. 自己总结的redis面试题(4)
  3. 2022年Android Studio详细下载,安装使用教程
  4. mysql union详解_MySQL 联合查询union详解-Fun言
  5. 【西川善司】3D图形的概念和渲染管线(5回完)
  6. 体面的辞职信(搞笑版)
  7. 开发信,真有 “高回复率+万能” 的模板吗?
  8. JavaScript面向对象精要(二)
  9. linux 文件擦除,Linux下使用bcwipe擦除磁盘空间
  10. base64转PDF