消消乐算法总结

前言

最近在工作中遇到一个问题,做一个消消乐的demo项目,连续相同数目超过四个后就要消除。我在网上看了很多解决方案,有十字形,横向,纵向,梯形搜索。越看越迷糊。这不是用一个BFS就能解决的问题吗?为什么要设定这么多情况?难道是为了优化吗?但是用BFS的同时用一个矩阵记录已经寻找过的元素不就可以提高效率吗?鉴于网上的解决方案如此的低级,还有的需要收费,或者说我没有找到。所以今天我就讲讲我的解决方案并附上代码,希望能有人从我的文章获得收益。消消乐其实也就是两个算法的组合:消除算法,填充算法。

消除算法

先讲讲我的思路:

  1. 生成随机矩阵,虽然网上有一大堆说生成的矩阵不能直接消除,所以又会有算法来解决这个问题,这里我就不说了,我就用随机生成的矩阵吧。
  2. 遍历矩阵中的每一个元素
  3. 对每一个元素利用BFS进行寻找周围四个方向的元素,同时在遍历的过程中需要进行过滤,防止对一个元素进行重复便利最终导致死循环。
var gameMatrix = new Array(4).fill(0).map(()=>new Array(4).fill(0));
!function createData(){for (let i = 0; i < 4; i++) {for (let j = 0; j < 4; j++) {this.gameMatrix[i][j] = Math.ceil(Math.random()*5)}}
}()console.log("当前随机矩阵",gameMatrix)function detectCount(i,j,cur,path){let key = i+","+j;path.push(key)let inArea = (i,j)=>{return i>=0 && i<4 && j>=0 && j<4;   }[[0,1],[0,-1],[1,0],[-1,0]].forEach((dir)=>{let x = i+dir[0];let y = j+dir[1];if(inArea(x,y) && this.gameMatrix[x][y] == cur && !path.includes(x+","+y)){return detectCount(x,y,cur,path)}})return path.length;}function detectAround(){let countMatrix = new Array(4).fill(0).map(()=>new Array(4).fill(0));for (let i = 0; i < 4; i++) {for (let j = 0; j < 4; j++) {countMatrix[i][j] = this.detectCount(i,j,this.gameMatrix[i][j],[]);;}}return countMatrix;
}console.log("结果矩阵",detectAround())

看一下结果吧
在这里插入图片描述

填充算法

上面我们知道了要消除的元素后,我们就可以把对应位置的元素进行消除,把上方的元素向下滑动然后在空余填充新的元素。概括起来就时以下三种操作,完全可以通过一个算法实现。

  • 消除
  • 滑动
  • 填充
function detectHeight(i,j,isDown){let height = 0;if (isDown) {for (let k = j + 1; k < 4; k++) {if (this.countMatrix[k][i] >= 3) {height++;}}} else {for (let k = 0; k < j; k++) {if (this.countMatrix[k][i] < 3) {height++;}}}return height;
}function fillMatrix(){let help = new Map();for (let i = 0; i < 4; i++) {for (let j = 0; j < 4; j++) {if(this.countMatrix[i][j] < 3){let key = i+","+j;help.set(key,this.gameMatrix[i][j]);}}}for (let i = 0; i < 4; i++) {for (let j = 0; j < 4; j++) {let key = i+","+j;if(help.has(key)){let height = detectHeight(i,j,true);this.gameMatrix[i][j+height] = help.get(key);}else{let height = detectHeight(i,j,false);this.gameMatrix[i][j-height] = 100;}}}}

计算结果:
在这里插入图片描述
这是我找的比较好的一种结果,这个算法目前还有点问题。等我后续补齐吧。或者谁发现问题了帮我看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/643940.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADC内部运行原理

1以一个简单的外置ADC为例讲解 1在外部由地址锁存和译码经行去控制通道选择开关//去控制外部那一条IO口输入&#xff0c;输入到比较器 2逐次逼近寄存器SAR每次从三态锁存缓冲器读取值在由DAC&#xff08;数模转换成模拟电压&#xff09;在输入到比较器当io信号和DAC信号几乎一样…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

LeetCode78:子集

题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集 &#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 代码 class Solution { public:vector<vector<int>> res;vector<…

【数据库】MongoDB

文章目录 [toc]数据库操作查询数据库切换数据库查询当前数据库删除数据库查询数据库版本 数据集合操作创建数据集合查询数据集合删除数据集合 数据插入插入id重复的数据 数据更新数据更新一条丢失其他字段保留其他字段 数据批量更新 数据删除数据删除一条数据批量删除 数据查询…

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码&#xff0c;当我用Qt配置opencv的CMakeLists.txt时&#xff0c;出现了以下配置错误&#xff1a; 首先我根据下述博文介绍&#xff0c;手动配置了CMake&#xff0c;但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

如何将web content项目导入idea并部署到tomcat

将Web Content项目导入IntelliJ IDEA并部署到Tomcat主要涉及以下几个步骤&#xff1a; 1. 导入Web Content项目 打开IntelliJ IDEA。选择“File” -> “New” -> “Project from Existing Sources…”。浏览到你的Web Content项目的文件夹&#xff0c;并选择它。Intell…

【书生浦语第二期实战营学习笔记作业(七)】

课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md 课程作业&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/opencompass/homework.md OpenCompass 大模型评测实战 1. 大模型的评测1.1 大模型评测如何促进发展1.2 大…

http是什么?http的基础知识教程详解(2024-04-24)

1、http的概念 HTTP&#xff08;超文本传输协议&#xff0c;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式、超媒体信息系统的应用层协议。 HTTP 是万维网&#xff08;WWW&#xff09;的数据通信的基础&#xff0c;设计目的是确保客户端与服务器之间的通…

LangSmith帮助测试大模型系统

LangSmith是评估大模型能力好坏的评估工具,能够量化评估基于大模型的系统的效果。LangSmith通过记录langchain构建的大模型应用的中间过程,从而能够更好的调整提示词等中间过程做优化。想要使用LangSmith首先进入他的设置页面,https://smith.langchain.com/settings注册一个…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具&#xff0c;处理音视频&#xff0c;剪辑&#xff0c;合并&#xff0c;转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…