UVa 10632 Pyramid
题目描述在一个经典的电脑游戏中一个生物在金字塔形状的格子上跳跃。金字塔共有nnn行第iii行有iii个格子。生物每次只能跳到其正上方或正下方的相邻格子不能跳出金字塔。当生物落在一个格子上时该格子的颜色会按照红色→\to→绿色→\to→蓝色→\to→红色的顺序循环改变。给定每个格子的初始颜色R、G、B需要找到一个不超过500050005000次跳跃的序列使得所有格子最终都变为蓝色。你可以选择金字塔中任意一个格子作为起点保证解总是存在第一次改变颜色的格子是跳跃后落地的格子。输入格式输入包含多组测试用例最多505050组。每组测试用例的第一行是一个整数nnn2≤n≤402 \le n \le 402≤n≤40表示金字塔的高度。接下来nnn行描述金字塔的初始配置每行由大写字母R、G、B组成代表该行从左到右的颜色。输入以n0n 0n0结束该行不处理。输出格式对于每组测试用例输出两行。第一行包含两个整数表示起始位置第一个整数为行号111表示最顶行第二个整数为该行的格子编号111表示最左。第二行是一个由字符7、9、1、3组成的字符串表示跳跃方向7向左上方跳跃9向右上方跳跃1向左下方跳跃3向右下方跳跃字符串长度不超过500050005000。任何合法的跳跃序列都会被接受。样例输入4 B RG BGR GBRB 2 R GB 0输出3 1 193919193919373737717191991919373737 2 1 919题目分析题目要求我们构造一个长度不超过500050005000的跳跃序列使得金字塔中所有格子最终都变成蓝色。每个格子的颜色状态只有333种红、绿、蓝且每次落地都会推动该格子颜色循环一步因此我们可以把“还需要几次落地才能变蓝”作为每个格子的需求值dr,c∈{0,1,2}d_{r,c} \in \{0,1,2\}dr,c​∈{0,1,2}。由于n≤40n \le 40n≤40总格子数最多只有40×412820\frac{40 \times 41}{2} 820240×41​820个而跳跃次数上限为500050005000这意味着我们可以采用一种系统性的构造方法而不是搜索最短路。关键在于找到一种能够“逐个消灭”格子需求的操作模式同时保证过程中不会将已经变蓝的格子再次弄乱。观察金字塔的几何结构除了顶部的第111行和第222行之外其余行都可以通过特定的模式操作在不破坏上方已处理格子的前提下将当前行的格子逐一变为蓝色。递归地自底向上处理即可。解题思路本题解采用自底向上、按列归约的递归构造。核心思想是将金字塔从底部到顶部逐行处理对于当前行的每一个格子利用其与“右上方”或“左上方”邻格的来回跳跃在不影响更上方格子的前提下将其变蓝。颜色与方向编码将颜色映射为整数R→0\to 0→0G→1\to 1→1B→2\to 2→2。目标颜色为222。用dr,c(2−color3) mod 3d_{r,c} (2 - \text{color} 3) \bmod 3dr,c​(2−color3)mod3表示格子还需要几次落地。每次落地的效果等价于dr,c←(dr,c−1) mod 3d_{r,c} \leftarrow (d_{r,c} - 1) \bmod 3dr,c​←(dr,c​−1)mod3。跳跃方向用数字字符表示7\texttt{7}7向左上方(r,c)→(r−1,c−1)(r,c) \to (r-1, c-1)(r,c)→(r−1,c−1)9\texttt{9}9向右上方(r,c)→(r−1,c)(r,c) \to (r-1, c)(r,c)→(r−1,c)1\texttt{1}1向左下方(r,c)→(r1,c)(r,c) \to (r1, c)(r,c)→(r1,c)3\texttt{3}3向右下方(r,c)→(r1,c1)(r,c) \to (r1, c1)(r,c)→(r1,c1)递归函数的定义递归函数dfs(r,c)\texttt{dfs}(r, c)dfs(r,c)的含义是当前位于格子(r,c)(r, c)(r,c)且保证(r,c)(r, c)(r,c)及其左下、右下区域尚未被处理。函数会通过一系列跳跃最终将(r,c)(r, c)(r,c)及它“右下方”的所有格子全部变为蓝色并且结束时的位置固定为(n,n)(n, n)(n,n)金字塔底部右下角或某个特定位置便于上层调用。递归分两种情况对角线格子(rc)(r c)(rc)此时(r,c)(r,c)(r,c)和其右下方邻居(r1,c1)(r1, c1)(r1,c1)构成一对。首先反复执行“右下→\to→左上”37\texttt{3} \texttt{7}37的组合第一步3\texttt{3}3跳到(r1,c1)(r1, c1)(r1,c1)落地将其需求减111第二步7\texttt{7}7跳回(r,c)(r, c)(r,c)落地将其需求减111。这样一次往返恰好让(r,c)(r,c)(r,c)的需求减少111而(r1,c1)(r1,c1)(r1,c1)的需求减少111。重复该过程直到(r,c)(r,c)(r,c)变为蓝色dr,c0d_{r,c} 0dr,c​0。处理完(r,c)(r,c)(r,c)后如果(r1,c1)(r1,c1)(r1,c1)也已蓝且rn−1r n-1rn−1则整个金字塔已处理完毕返回。否则执行一次单独的3\texttt{3}3跳到(r1,c1)(r1,c1)(r1,c1)将其需求减111然后沿左下方向1\texttt{1}1一步一步向下移动到底部第nnn行。最后递归调用dfs(n,c1)\texttt{dfs}(n, c1)dfs(n,c1)处理下一列。非对角线格子(rc)(r c)(rc)此时(r,c)(r,c)(r,c)和其右上邻居(r−1,c)(r-1, c)(r−1,c)为一对。反复执行“右上→\to→左下”91\texttt{9} \texttt{1}91的组合第一步9\texttt{9}9跳到(r−1,c)(r-1, c)(r−1,c)第二步1\texttt{1}1跳回(r,c)(r, c)(r,c)。同样每往返一次(r,c)(r,c)(r,c)的需求减111(r−1,c)(r-1,c)(r−1,c)的需求也减111。重复直至(r,c)(r,c)(r,c)变蓝。执行一次单独的9\texttt{9}9跳到(r−1,c)(r-1, c)(r−1,c)然后递归调用dfs(r−1,c)\texttt{dfs}(r-1, c)dfs(r−1,c)继续处理上一行。起始位置的选择先以底部最左侧(n,1)(n, 1)(n,1)为起点调用dfs(n,1)\texttt{dfs}(n, 1)dfs(n,1)。如果最终右下角(n,n)(n, n)(n,n)不是蓝色说明该起点不能直接成功。此时改为从(n−1,1)(n-1, 1)(n−1,1)出发先向下跳一步1\texttt{1}1改变(n,1)(n, 1)(n,1)的颜色再恢复初始颜色备份重新调用dfs(n,1)\texttt{dfs}(n, 1)dfs(n,1)。这样可以保证构造成功。正确性保证递归过程中每次往返操作只改变当前格及其斜上方/斜下方同伴的颜色不影响已经处理好的上方区域。通过按列和行的严格顺序所有格子都能被恰当地消除需求。由于总跳跃次数与每个格子的需求成正比最大需求为222每个格子最多被处理常数次总长度远小于500050005000。此构造方法利用了金字塔的几何限制只能垂直方向跳跃使得局部操作不会扩散到其他列。复杂度分析每组测试用例的时间复杂度为O(n2)O(n^2)O(n2)主要来自递归调用和对每个格子的常数次操作。空间复杂度为O(n2)O(n^2)O(n2)用于存储颜色状态和跳跃序列。由于n≤40n \le 40n≤40完全足够。代码实现// Pyramid// UVa ID: 10632// Verdict: Accepted// Submission Date: 2026-06-20// UVa Run Time: 0.000s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAXN55;intn;intcol[MAXN][MAXN];// 当前颜色 0R,1G,2Bintbackup[MAXN][MAXN];// 初始颜色备份vectorintpath;// 存储跳跃方向数字// 递归构造跳跃序列voiddfs(intr,intc){if(rncn)return;if(rc){// 对角线上的格子intnrr1,ncc1;// 通过来回跳跃将 (r,c) 变成蓝色while(col[r][c]!2){path.push_back(3);// 右下path.push_back(7);// 左上col[nr][nc](col[nr][nc]1)%3;col[r][c](col[r][c]1)%3;}// 若已经到达底部倒数第二格且右下角已是蓝色结束if(col[nr][nc]2rn-1cn-1)return;// 跳向右下方处理下一列path.push_back(3);col[nr][nc](col[nr][nc]1)%3;// 沿着左边向下移动到底部while(nrn){path.push_back(1);// 左下nr;col[nr][nc](col[nr][nc]1)%3;}dfs(n,c1);}else{// 非对角线 (r c)intnrr-1,ncc;// 通过来回跳跃将 (r,c) 变成蓝色while(col[r][c]!2){path.push_back(9);// 右上path.push_back(1);// 左下col[nr][nc](col[nr][nc]1)%3;col[r][c](col[r][c]1)%3;}// 跳向右上方继续处理上一行path.push_back(9);col[nr][nc](col[nr][nc]1)%3;dfs(nr,nc);}}intmain(){ios::sync_with_stdio(false);cin.tie(0);while(cinnn!0){// 读入初始配置for(inti1;in;i){string s;cins;for(intj1;ji;j){charchs[j-1];intval(chR?0:(chG?1:2));backup[i][j]col[i][j]val;}}path.clear();dfs(n,1);// 尝试从底部最左出发intstartRow;if(col[n][n]!2){// 若右下角未变蓝从上一行重新开始path.clear();path.push_back(1);// 先向下跳一步backup[n][1](backup[n][1]1)%3;for(inti1;in;i)for(intj1;ji;j)col[i][j]backup[i][j];dfs(n,1);startRown-1;}else{startRown;}coutstartRow 1\n;for(intd:path)coutchar(d0);cout\n;}return0;}总结本题是一道构造性极强的题目关键观察点是金字塔跳跃只能影响相邻上下行而且颜色变化只有三种状态。利用“对角线”和“非对角线”两种局部的来回跳跃模式我们可以像“消消乐”一样从底部开始逐个清空格子的需求同时确保不破坏已处理区域。递归调用使得代码结构清晰方向字符与几何跳转一一对应。这种利用局部操作逐步归约的构造方法在处理有限状态的网格问题时往往能发挥奇效。

相关新闻

DDPM——理论准备

DDPM——理论准备

U-Net网络与扩散模型 u-net网络是绝大多数扩散模型的标准去噪网络骨架,对称编解码 跳跃连接,非常适配扩散模型。所以,我们有必要弄清u-net在扩散模型中的使用 想搞懂「U-Net 为适配扩散做了哪些基础改动」,DDPM是学术经典入门案例…

2026/8/25 11:15:11 阅读更多 →
Hexo+Netlify-CMS+Vercel:打造自动化静态博客工作流

Hexo+Netlify-CMS+Vercel:打造自动化静态博客工作流

1. 项目概述:为什么选择这套“在线构建”方案? 如果你厌倦了每次更新博客都要在本地敲命令、等构建、再手动上传到服务器,那么这套“Hexo Netlify-CMS Vercel”的组合拳,可能就是为你量身定做的现代化静态博客解决方案。我把它…

2026/8/25 11:15:11 阅读更多 →
从浏览器模拟到API调用:智能体架构的效率革命与实战

从浏览器模拟到API调用:智能体架构的效率革命与实战

1. 从“浏览器优先”到“API优先”:一个架构理念的转变最近在设计和重构一些自动化流程时,我反复思考一个问题:为什么我们总是下意识地让智能体(Agent)先去模拟浏览器操作?无论是爬虫、RPA还是AI驱动的自动…

2026/8/25 11:15:11 阅读更多 →

最新新闻

锤子助手第041个开关:启用对话内链接可选Safari访问的位置、验证方法与跨浏览器隐私边界

锤子助手第041个开关:启用对话内链接可选Safari访问的位置、验证方法与跨浏览器隐私边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/25 11:59:43 阅读更多 →
锤子助手第042个开关:启用快捷搜索对话输入框文字表情的位置、验证方法与输入内容边界

锤子助手第042个开关:启用快捷搜索对话输入框文字表情的位置、验证方法与输入内容边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/25 11:59:43 阅读更多 →
LangChain:ChatModel 聊天模型与可配置模拟器

LangChain:ChatModel 聊天模型与可配置模拟器

目录 一、什么是聊天模型 1.1 什么是消息 1.2 模型的分类 1.2.1 真实聊天模型 1.2.2 可配置模拟器模型 1.3 与LLM的区别 1.4 注意事项 二、通过API来定义聊天模型 2.1 ChatDeepSeek 2.2 init_chat_model 2.2.1 函数定义 2.2.2 实例1:创建无配置模型 2.…

2026/8/25 11:59:43 阅读更多 →
从简历到技术面,Java面试考察的关键能力

从简历到技术面,Java面试考察的关键能力

一份简历躺在邮箱里七秒,决定它命运的不是学历栏,而是技术栈后面那行不起眼的“熟悉XXX”。绝大多数Java候选人死在第一关,不是技术不够,而是简历上的每一个关键词都在替面试官划好考点,而你自己根本没意识到。从简历初…

2026/8/25 11:59:43 阅读更多 →
基于Hadoop大数据的热门游戏推荐系统的设计与实现(源码+LW+部署讲解)

基于Hadoop大数据的热门游戏推荐系统的设计与实现(源码+LW+部署讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/25 11:59:43 阅读更多 →
Yuki第007个开关:骰子与猜拳结果设置的位置、验证方法与公平互动边界

Yuki第007个开关:骰子与猜拳结果设置的位置、验证方法与公平互动边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/25 11:58:43 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →