题目描述

Mayan puzzle 是最近流行起来的一个游戏。游戏界面是一个 7 7 7 × 5 \times5 ×5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

  1. 每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图 6 6 6 到图 7 7 7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图 1 1 1 和图 2 2 2);

  1. 任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1 到图3)。

注意:

a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图 4 4 4,三个颜色为 1 1 1 的方块和三个颜色为 2 2 2 的方块会同时被消除,最后剩下一个颜色为 2 2 2 的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5 所示的情形, 5 5 5 个方块会同时被消除)。

  1. 方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。

上面图 1 1 1 到图 3 3 3 给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为 ( 0 , 0 ) (0,0) (0,0),将位于 ( 3 , 3 ) (3,3) (3,3) 的方块向左移动之后,游戏界面从图 1 1 1 变成图 2 2 2 所示的状态,此时在一竖列上有连续三块颜色为 4 4 4 的方块,满足消除条件,消除连续 3 3 3 块颜色为 4 4 4 的方块后,上方的颜色为 3 3 3 的方块掉落,形成图 3 3 3 所示的局面。

输入格式

6 6 6 行。

第一行为一个正整数 n n n,表示要求游戏通关的步数。

接下来的 5 5 5 行,描述 7 × 5 7 \times 5 7×5 的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个 0 0 0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于 10 10 10 种,从 1 1 1 开始顺序编号,相同数字表示相同颜色)。

输入数据保证初始棋盘中没有可以消除的方块。

输出格式

如果有解决方案,输出 n n n 行,每行包含 3 3 3 个整数 x , y , g x,y,g x,y,g,表示一次移动,每两个整数之间用一个空格隔开,其中 ( x , y ) (x,y) (x,y) 表示要移动的方块的坐标, g g g 表示移动的方向, 1 1 1 表示向右移动, − 1 -1 1 表示向左移动。注意:多组解时,按照 x x x 为第一关键字, y y y 为第二关键字, 1 1 1 优先于 − 1 -1 1,给出一组字典序最小的解。游戏界面左下角的坐标为 ( 0 , 0 ) (0,0) (0,0)

如果没有解决方案,输出一行 -1

输入输出样例 #1

输入 #1

3
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0

输出 #1

2 1 1
3 1 1
3 0 1

说明/提示

【输入输出样例说明】

按箭头方向的顺序分别为图 6 6 6 到图 11 11 11

样例输入的游戏局面如上面第一个图片所示,依次移动的三步是: ( 2 , 1 ) (2,1) (2,1) 处的方格向右移动, ( 3 , 1 ) (3,1) (3,1) 处的方格向右移动, ( 3 , 0 ) (3,0) (3,0) 处的方格向右移动,最后可以将棋盘上所有方块消除。

【数据范围】

对于 30 % 30\% 30% 的数据,初始棋盘上的方块都在棋盘的最下面一行;

对于 100 % 100\% 100% 的数据, 0 < n ≤ 5 0<n \le 5 0<n5

算法思路

  • 状态表示:
  • 使用矩阵 m m m存储网格状态, m [ i ] [ j ] m[i][j] m[i][j]表示第 i i i列第 j j j行的颜色值( 1 ≤ i ≤ 5 , 1 ≤ j ≤ 7 1\leq i\leq 5, 1\leq j\leq 7 1i5,1j7)。
  • 数组 n u m [ i ] num[i] num[i]记录第 i i i列当前方块数量。
  • 操作序列用 x [ ] , y [ ] , y i [ ] x[], y[], yi[] x[],y[],yi[]分别存储行、列和方向( − 1 -1 1左移, 1 1 1右移)。

核心函数:

  • 消除检测(sd):扫描全图,标记水平或垂直连续三个及以上同色方块为 0 0 0(消除)。返回是否发生消除。 检测条件: { m [ i ] [ j ] = m [ i ± 1 ] [ j ] ≠ 0 (垂直)  m [ i ] [ j ] = m [ i ] [ j ± 1 ] ≠ 0 (水平) \text{检测条件:} \begin{cases} m[i][j] = m[i\pm1][j] \neq 0 & \text{(垂直)} \ m[i][j] = m[i][j\pm1] \neq 0 & \text{(水平)} \end{cases} 检测条件:{m[i][j]=m[i±1][j]=0(垂直) m[i][j]=m[i][j±1]=0(水平)
  • 下落处理(xia):消除后,每列方块下落填补空隙,更新 n u m num num数组。
  • 连锁消除(find):递归调用sd和xia,直到无更多消除。
  • 深度优先搜索(dfs):
  • 终止条件:剩余步数 j s = 0 js=0 js=0时,若所有 n u m [ i ] = 0 num[i]=0 num[i]=0则找到解( f l a g = 1 flag=1 flag=1)。
  • 状态转移:遍历每个方块,尝试与左右相邻方块交换(需边界检查),执行连锁消除后递归搜索 j s − 1 js-1 js1步。
  • 回溯机制:每次尝试前保存 m m m n u m num num状态,递归返回后恢复。

剪枝优化:

  • f l a g = 1 flag=1 flag=1时立即返回,避免无效搜索。
  • 优先尝试可行操作,减少状态空间。

复杂度分析

  • 时间复杂度:最坏情况 O ( ( 5 × 7 ) n ) O((5\times7)^n) O((5×7)n),每层递归尝试最多 5 × 7 × 2 = 70 5\times7\times2=70 5×7×2=70种操作( n n n步操作)。
  • 空间复杂度: O ( 1 ) O(1) O(1),状态备份使用固定大小数组。

优化建议

  • 剪枝增强:记录已访问状态哈希,避免重复搜索。
  • 启发式搜索:优先选择可能触发更多消除的操作。
  • 迭代加深:当 n n n较大时,改用IDDFS(迭代加深DFS)控制深度。
  • 该解法通过DFS枚举所有操作序列,结合回溯和状态恢复,确保在有限步数内找到可行解。注意网- - 格行列索引从 0 0 0开始输出,方向 − 1 -1 1/ 1 1 1对应左/右移动。

详细代码

#include<bits/stdc++.h>
#define int long long
#define pi pair<int,int>
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
using namespace std;
int n,m[10][10],x[6],y[6],yi[6],num[10],a,flag;
bool vis[10][10];
bool check()
{for(int i=1;i<=5;i++)if(num[i])return 0;return 1;
}
bool sd()
{int m1[10][10];memcpy(m1,m,sizeof(m1));bool ff=0;for(int i=1;i<=5;i++)for(int j=1;j<=7;j++){if(m1[i][j]==m1[i-1][j]&&m1[i][j]==m1[i+1][j]&&m1[i][j]!=0)m[i][j]=0,m[i-1][j]=0,m[i+1][j]=0,ff=1;if(m1[i][j]==m1[i][j+1]&&m1[i][j]==m1[i][j-1]&&m1[i][j]!=0)m[i][j]=0,m[i][j+1]=0,m[i][j-1]=0,ff=1;}return ff;
}
void xia()
{int m1[10][10];memcpy(m1,m,sizeof(m1));memset(m,0,sizeof(m));for(int i=1;i<=5;i++){int js=0;for(int j=1;j<=7;j++){if(m1[i][j])m[i][++js]=m1[i][j];}num[i]=js;}
}
void find()
{if(sd()){xia();find();return;}
}
void dfs(int js)
{
//	for(int i=1;i<=5;i++)
//	{
//		for(int j=1;j<=num[i];j++)
//			cout<<num[i];
//		cout<<'\n';
//	}
//	cout<<"-----------------------------"<<'\n';if(js==0&&check()){flag=1;return;}if(js==0)return;int m1[10][10],nn[10];memcpy(m1,m,sizeof(m1));memcpy(nn,num,sizeof(nn));for(int i=1;i<=5;i++)for(int j=1;j<=nn[i];j++){if(i>1&&!m[i-1][j]){swap(m[i-1][j],m[i][j]);xia();find();x[js]=i;y[js]=j;yi[js]=-1;dfs(js-1);if(flag)return;memcpy(num,nn,sizeof(num));memcpy(m,m1,sizeof(m));}if(i<5){swap(m[i][j],m[i+1][j]);xia();find();x[js]=i;y[js]=j;yi[js]=1;dfs(js-1);if(flag)return;memcpy(num,nn,sizeof(num));memcpy(m,m1,sizeof(m));}}
}
signed main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=5;i++){while(cin>>a&&a!=0){m[i][++num[i]]=a;}}dfs(n);if(flag)for(int i=n;i>=1;i--)cout<<x[i]-1<<" "<<y[i]-1<<" "<<yi[i]<<'\n';elsecout<<-1;return 0;
}

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

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

相关文章

Spring Boot 2 多模块项目中配置文件的加载顺序

Spring Boot 2 多模块项目中配置文件的加载顺序 在 Spring Boot 2 多模块项目中&#xff0c;配置文件的加载遵循特定的顺序规则。了解这些规则对于正确管理多模块应用的配置至关重要。 一、默认配置文件加载顺序 Spring Boot 会按照以下顺序加载 application.properties 或 …

边界的艺术:支持向量机与统计学习时代的王者

当扬勒丘恩的卷积神经网络LeNet在90年代初于手写数字识别领域绽放光芒&#xff0c;却因计算与数据的桎梏未能点燃更广泛的燎原之火时&#xff0c;人工智能&#xff0c;特别是其子领域机器学习&#xff0c;正步入一个理论深化与方法论多元化的关键时期。经历了符号主义通用智能探…

js filter()

listType(queryParams.value).then(response > {filterTable.value response.rows.slice(1); // 只显示前3条数据;filterTable.value filterTable.value.filter(item > {return wnSensorsList.value.some(sensorsgroup > {return sensorsgroup.sensorType item.cod…

Python 库 包 nltk (Natural Language Toolkit)

文章目录 &#x1f9f0; 一、nltk 的主要功能✅ 文本处理功能✅ 内置语料库&#xff08;Corpora&#xff09; &#x1f4e6; 二、安装与使用1. 安装 nltk2. 下载语料库&#xff08;第一次使用时需要下载&#xff09; &#x1f50d; 三、常用功能示例示例 1&#xff1a;分词示例…

设计模式之房产中介——代理模式

手撕设计模式之房产中介——代理模式 1.业务需求 ​ 大家好&#xff0c;我是菠菜啊&#xff0c;好久不见&#xff0c;今天给大家带来的是——代理模式。老规矩&#xff0c;在介绍这期内容前&#xff0c;我们先来看看这样的需求&#xff1a;我们有一套房产需要出售&#xff0c…

Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#

Unity打包 Android、ios、Pad 终端设备局域网IP调试、USB调试 今天咱们继续进阶课程&#xff0c;定期更新&#xff0c;有想学习的不懂的地方也可以告诉我。 提示&#xff1a;内容纯个人编写&#xff0c;欢迎评论点赞&#xff0c;来指正我。 文章目录 Unity打包 Android、ios、P…

c++中的mutex同步机制与多线程同步实现

C 中的 std::mutex 与多线程同步 在多线程编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09; 是一种同步机制&#xff0c;用于保护共享资源&#xff08;如变量、数据结构&#xff09;免受数据竞争&#xff08;Data Race&#xff09;的影响。C 标准库中的 std::mutex 提供…

网络安全2023—新安全新发展

关于绿盟科技 绿盟科技集团股份有限公司(以下简称绿盟科技),成立于 2000 年 4 月,总部位于北京。公司于 2014 年 1 月 29 日在深圳证券交易所创业板上市,证券代码:300369。绿盟科技在国内设有 50余个分支机构,为政府、金融、运营商、能源、交通、科教文卫等行业用户与各…

WebSocket扫盲

WebSocket 是一种网络通信协议&#xff0c;它允许在单个 TCP 连接上进行全双工、双向的实时通信。它是为了解决传统 HTTP 协议在实时交互应用中的局限性而设计的。 核心概念和特点 解决 HTTP 的痛点&#xff1a; 单向性&#xff1a; HTTP 是请求-响应模式。客户端发起请求&…

Springboot整合高德地图

1.登录高德开放平台 高德开放平台 | 高德地图API 2.获取密钥key 1.点击控制台 2.创建新应用 3.添加key 4.创建key 5.获取key 3.java整合 1.高德配置类 package com.thk.controller.map;import org.springframework.beans.factory.annotation.Value; import org.springfram…

【SQL知识】PDO 和 MySQLi 的区别

目录 简介 主要区别 预处理语句示例比较 PDO 示例 MySQLi 示例 选择建议 简介 PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于数据库操作的扩展&#xff0c;都支持预处理语句&#xff0c;但有一些重要区别&#xff1a; 主要区别 数据库支持 PDO&am…

python打卡 DAY 45 Tensorboard使用介绍

目录 一、TensorBoard 发展历史与原理 1. 演进历程 2. 核心架构原理 二、TensorBoard 核心功能操作 1. 基础配置方法 2. 常用功能速查表 三、CIFAR10 实战演示 1. MLP 模型监控配置 2. CNN 特征可视化 四、TensorBoard 高级功能 1. 超参数调优 2. 3D点云可视化 五、…

Swift 中 Result 类型全解析:从基础到进阶

在现代 iOS 开发中&#xff0c;Swift 的 Result 类型是处理同步与异步错误的一大利器。相比传统的 throws / do-catch 语法&#xff0c;它更清晰、结构化&#xff0c;也更易于组合式编程。 本文将带你从 Result 的基础定义出发&#xff0c;逐步深入其在实际项目中的多种应用&am…

Github 2025-06-28 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-06-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Rust实现的非官方Bitwarden兼容服务器 创建周期:2317 天开发语言:Rust协议类型:GNU Affero General Public License v3.0Star数量…

python 写一个判断文本中是否有手机号的函数,并提取出文本中的手机号

我们需要判断文本中是否有手机号&#xff0c;并提取出手机号。 中国大陆的手机号规则&#xff1a; 1. 通常为11位数字。 2. 目前手机号段分配如下&#xff1a; - 移动号段&#xff1a;134(0-8)、135、136、137、138、139、147、148、150、151、152、157、158、159、172、178、1…

作物生长模型Oryza V3实战12:drate程序详解

drate(v2).exe,可以通过观察移植日、穗部分化、开花和成熟的物候日期(即日和年),DRATE(v2)用于校准四个阶段的发展速率:幼苗期(DVRJ,oCday-1)、光周期敏感期(DVRI,oCday-1)、穗部发育期(DVRP,oCday-1)和生殖期(DVRR,oCday-1)。 一 准备输入文件 1、准备.crp,.…

利用视觉-语言模型搭建机器人灵巧操作的支架

25年6月来自斯坦福和德国卡尔斯鲁厄理工的论文“Scaffolding Dexterous Manipulation with Vision-Language Models”。 灵巧机械手对于执行复杂的操作任务至关重要&#xff0c;但由于演示收集和高维控制的挑战&#xff0c;其训练仍然困难重重。虽然强化学习 (RL) 可以通过在模…

面试拷打-20250701

memcopy和memmov 详细解释 示例1&#xff1a;不重叠的内存区域 正常复制。 示例2&#xff1a;重叠的内存区域 原始数据&#xff1a;src2是一个包含字符串"HelloWorld"的字符数组。使用memcpy&#xff1a; memcpy(src2 2, src2, 5);试图将src2中的前5个字符复制…

什么是 BigKey?

Redis BigKey 深度解析&#xff1a;识别、危害与优化方案 什么是 BigKey&#xff1f; 在 Redis 中&#xff0c;BigKey 是指存储大量数据的单个键&#xff0c;这些键通常具有异常大的内存占用或包含大量元素。BigKey 不是由数据类型定义&#xff0c;而是由其资源消耗决定的。 …

量化选股策略 聚宽

# 量化选股策略完整分析与优化建议 ## 策略整体架构分析 这个量化交易策略主要由以下几个核心部分组成&#xff1a; 1. **初始化设置**&#xff1a;配置基准指数、交易参数和全局变量 2. **选股逻辑**&#xff1a;通过财务指标筛选优质股票 3. **股票过滤**&#xff1a;排除…