洛谷P1312 [NOIP 2011 提高组] Mayan 游戏

题目
#算法/进阶搜索
思路:
根据题意,我们可以知道,这题只能枚举,剪枝,因此,我们考虑如何枚举,剪枝.
首先,我们要定义下降函数down(),使得小木块右移时,能够下降到最低处,其次,我们还需要写出判断函数,判断矩阵内是否有小木块没被消除.另外,我们还需要消除函数,将矩阵内三个相连的小木块清除,dfs()函数进行搜索

这里,我们定义数组横坐标代表原矩阵的列,纵坐标代表原矩阵的行,坐标轴从1,1开始

check判断函数:

直接判断当前矩阵中是否仍存在小正方行

  bool check(){for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(dp[i][j])return false;}}return true;}

clear()清除函数

由于我们后序每次将正方行下降后都需要判断当前是否需要清除,所以我们将clear定义为int,
判断的时候,我们三个一组的判断
1.先横向判断每一行是否有三个连续的
2.在竖向判断是否有三个连续的
注意:这里我们全部判断完后再进行删除,否则会出现4-5个连续的同色方块只能删除三个
int clear(){int g=0;int del[10][10]={0};
横向删除for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(!dp[i][j])continue;if(i>1&&i<5){if(dp[i-1][j]==dp[i][j]&&dp[i][j]==dp[i+1][j]){del[i-1][j]=del[i][j]=del[i+1][j]=g=1;}}}}
竖向删除for(int i=1;i<=5;i++){for(int j=2;j<=6;j++){if(dp[i][j]==0)continue;if(dp[i][j-1]==dp[i][j]&&dp[i][j]==dp[i][j+1]){del[i][j-1]=del[i][j]=del[i][j+1]=g=1;}}}for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(del[i][j]==1)dp[i][j]=0;}}return g;}

down()下降函数

在下降的时候,会出现一列的小正方形多组不连续,比如1020201,我们在下降的时候需要先将第一个2下降到最底部,再将第二个2下降到最底部,最后将1下降到最底部,所以,我们从下往上降
void down(){for(int i=1;i<=5;i++){
从原矩阵第二行开始下降for(int j=2;j<=7;j++){if(dp[i][j]==0)continue;int k=j;这里一定要添加限定条件k-1>=1while(k-1>=1&&dp[i][k-1]==0){swap(dp[i][k],dp[i][k-1]);k--;}}}}

dfs()函数

定义flag代表我们是否找到可删除合法方案

void dfs(int x){
如果已经删除完了,直接返回if(flag)return;if(x>n){if(check()){for(int i=1;i<=n;i++){
res,0放原坐标轴x,1放原坐标y,2放正方向移动方向cout<<res[i][0]<<' '<<res[i][1]<<' '<<res[i][2]<<endl;}flag=true;}return;}for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(dp[i][j]==0)continue;int tmp[10][10];
保存初始状态memcpy(tmp,dp,sizeof(tmp));
正方行右移if(i<5){res[x][0]=i-1;res[x][1]=j-1;res[x][2]=1;swap(dp[i][j],dp[i+1][j]);for(down();clear()!=0;down());dfs(x+1);
恢复初始状态memcpy(dp,tmp,sizeof(dp));}
正方向左移if(i>=2){res[x][0]=i-1;res[x][1]=j-1;res[x][2]=-1;swap(dp[i][j],dp[i-1][j]);for(down();clear()!=0;down());dfs(x+1);
恢复初始状态memcpy(dp,tmp,sizeof(dp));}}}}

完整代码

#include<iostream>#include<cstring>using namespace std;int n;int dp[10][10];int res[30][3];bool flag=false;bool check(){for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(dp[i][j])return false;}}return true;}int clear(){int g=0;int del[10][10]={0};for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(!dp[i][j])continue;if(i>1&&i<5){if(dp[i-1][j]==dp[i][j]&&dp[i][j]==dp[i+1][j]){del[i-1][j]=del[i][j]=del[i+1][j]=g=1;}}}}for(int i=1;i<=5;i++){for(int j=2;j<=6;j++){if(dp[i][j]==0)continue;if(dp[i][j-1]==dp[i][j]&&dp[i][j]==dp[i][j+1]){del[i][j-1]=del[i][j]=del[i][j+1]=g=1;}}}for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(del[i][j]==1)dp[i][j]=0;}}return g;}void down(){for(int i=1;i<=5;i++){for(int j=2;j<=7;j++){if(dp[i][j]==0)continue;int k=j;while(k-1>=1&&dp[i][k-1]==0){swap(dp[i][k],dp[i][k-1]);k--;}}}}void dfs(int x){if(flag)return;if(x>n){if(check()){for(int i=1;i<=n;i++){cout<<res[i][0]<<' '<<res[i][1]<<' '<<res[i][2]<<endl;}flag=true;}return;}for(int i=1;i<=5;i++){for(int j=1;j<=7;j++){if(dp[i][j]==0)continue;int tmp[10][10];memcpy(tmp,dp,sizeof(tmp));if(i<5){res[x][0]=i-1;res[x][1]=j-1;res[x][2]=1;swap(dp[i][j],dp[i+1][j]);for(down();clear()!=0;down());dfs(x+1);memcpy(dp,tmp,sizeof(dp));}if(i>=2){res[x][0]=i-1;res[x][1]=j-1;res[x][2]=-1;swap(dp[i][j],dp[i-1][j]);for(down();clear()!=0;down());dfs(x+1);memcpy(dp,tmp,sizeof(dp));}}}}int main(void){cin>>n;for(int i=1;i<=5;i++){int cnt=1;int tmp;while(cin>>tmp&&tmp){dp[i][cnt]=tmp;cnt++;}}dfs(1);if(flag==false){cout<<-1<<endl;}return 0;}

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

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

相关文章

基于Redis的3种分布式ID生成策略

在分布式系统设计中&#xff0c;全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进&#xff0c;传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。 Redis具备高性能、原子操作及简单易用的特性&…

Spotlight on Mysql详细介绍

1. 版本............................................................................................................................................1 2. 使用介绍...............................................................................................…

背包 DP 详解

文章目录 背包DP01 背包完全背包多重背包二进制优化单调队列优化 小结 背包DP 背包 DP&#xff0c;说白了就是往一个背包里扔东西&#xff0c;求最后的最大价值是多少&#xff0c;一般分为了三种&#xff1a;01 背包、完全背包和多重背包。而 01 背包则是一切的基础。 01 背包…

二级评论列表-Java实现

二级评论列表是很常见的功能&#xff0c;文章记录了新手用Java实现的具体逻辑。 整体实现逻辑是先用2个sql&#xff0c;分别查出两层数据。然后用java在service中实现数据组装&#xff0c;返给前端。这种实现思路好处是SQL简洁&#xff0c;逻辑分明&#xff0c;便于维护。 一…

快速入手-基于python和opencv的人脸检测

1、安装库 pip install opencv-python 如果下载比较卡的话&#xff0c;指向国内下载地址&#xff1a; pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 2、下载源码 https://opencv.org/ windows11对应的版本下载&#xff1a; https://pan.baidu…

GitLab本地安装指南

当前GitLab的最新版是v17.10&#xff0c;安装地址&#xff1a;https://about.gitlab.com/install/。当然国内也可以安装极狐GitLab版本&#xff0c;极狐GitLab 是 GitLab 中国发行版&#xff08;JH&#xff09;。极狐GitLab支持龙蜥&#xff0c;欧拉等国内的操作系统平台。安装…

OpenCv高阶(六)——图像的透视变换

目录 一、透视变换的定义与作用 二、透视变换的过程 三、OpenCV 中的透视变换函数 1. cv2.getPerspectiveTransform(src, dst) 2. cv2.warpPerspective(src, H, dsize, dstNone, flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue0) 四、文档扫描校正&a…

资源-又在网上淘到金了

前言&#xff1a; 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍&#xff1a; mantissa.xyz&#xff0c;about作者介绍为&#xff1a;Midge “Mantissa” Sinnaeve &#xff08;米奇辛纳夫&#xff09;是一位屡获殊荣的艺术家和导演&#xff0c;提供动画、…

Linux疑难杂惑 | 云服务器重装系统后vscode无法远程连接的问题

报错原因&#xff1a;本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方法&#xff1a;找到本地的known_hosts文件&#xff0c;把里面的所有东西删除后保存就好了。 该文件的路径可以在报错中寻找&#xff1a;比如我的路径就是&a…

FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)

本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…

【音视频】音视频FLV合成实战

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流&#xff0c;并将它们编码和封装输出到输出⽂件&#xff0c;输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作&#xff1a; avformat_write_header &#xff1a; 写⽂件…

全链路开源数据平台技术选型指南:六大实战工具链解析

在数字化转型加速的背景下&#xff0c;开源技术正重塑数据平台的技术格局。本文深度解析数据平台的全链路架构&#xff0c;精选六款兼具创新性与实用性的开源工具&#xff0c;涵盖数据编排、治理、实时计算、联邦查询等核心场景&#xff0c;为企业构建云原生数据架构提供可落地…

JAVA设计模式——(1)适配器模式

JAVA设计模式——&#xff08;1&#xff09;适配器模式 目的理解实现优势 目的 将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。 理解 可以想象成一个国标的插头&#xff0c;结果插座是德标的&…

Qt C++ 解析和处理 XML 文件示例

使用 Qt C 解析和处理 XML 文件 以下是使用 Qt C 实现 XML 文件处理的几种方法&#xff0c;包括解析、创建和修改 XML 文件。 1. 使用 QXmlStreamReader (推荐方式) #include <QFile> #include <QXmlStreamReader> #include <QDebug>void parseXmlWithStr…

坐标上海,20~40K的面试强度

继续分享最新的面经&#xff0c;面试的岗位是上海某公司的Golang开发岗&#xff0c;给的薪资范围是20~40K&#xff0c;对mongodb要求熟练掌握&#xff0c;所以面试过程中对于mongodb也问的比较多。 下面是我整理好的面经&#xff08;去除了项目相关的问题&#xff09;&#xf…

B端管理系统:企业运营的智慧大脑,精准指挥

B端管理系统的定义与核心功能 B端管理系统&#xff08;Business Management System&#xff09;是专门设计用于支持企业内部运作和外部业务交互的一套软件工具。它集成了多种功能模块&#xff0c;包括但不限于客户关系管理(CRM)、供应链管理(SCM)、人力资源管理(HRM)以及财务管…

IDE中使用Spring Data Redis

步骤一&#xff1a;导入Spring Data Redis的maven坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 步骤二&#xff1a;配置Redis数据源 步骤三&…

ARINC818协议的帧格式

SOFi:sof initiale;这个是第一个ADVB帧的SOF开始&#xff0c;一帧只有一个SOFi。 SOFn:sof normal;这个是非首个ADVB帧的SOF头的normal头。 Vsync为场同步&#xff0c;两个SOFi之间为Vsync信号&#xff0c;也就是一帧&#xff0c;也就是VS信号。 Hsync为行同步&#xff0c;如果…

Git核心命令

Git核心命令完全指南&#xff1a;从入门到高效协作 前言 在软件开发领域&#xff0c;Git已成为现代版本控制的代名词。据统计&#xff0c;全球超过90%的开发团队使用Git进行代码管理。然而&#xff0c;许多开发者仅停留在基础命令的机械使用层面&#xff0c;未能真正掌握Git命…

【计算机视觉】CV实战项目- Face-and-Emotion-Recognition 人脸情绪识别

Face-and-Emotion-Recognition 项目详细介绍 项目概述项目功能项目目录结构项目运行方式1. 环境准备2. 数据准备3. 模型训练4. 模型运行 常见问题及解决方法1. **安装依赖问题**2. **数据集问题**3. **模型训练问题**4. **模型运行问题** 项目实战建议项目参考文献 项目概述 F…