UVa 10632 Pyramid

发布时间:2026/8/25 11:15:05

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——理论准备

2026/8/25 11:15:05

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

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

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

2026/8/25 11:15:05

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

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

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

2026/8/25 11:15:05

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

JavaScript常见的内存泄露问题 - JavaScript学习系列文章

JavaScript常见的内存泄露问题 - JavaScript学习系列文章

2026/8/25 11:55:06

多前端同学可能觉得这是浏览器或引擎该操心的事, 但理解内存管理能帮你写出更高效的代码, 还能避免各种内存泄漏的坑. 一、常见的内存泄露场景 1) 意外的全局变量: function leaky() { leak 这是一个全局变量; // 本意是 let leak ... this.anotherLeak 这也是全局的; …

JavaScript对象与元编程 - JavaScript学习系列文章

JavaScript对象与元编程 - JavaScript学习系列文章

2026/8/25 11:55:06

一、属性描述符 当你写 obj.name张三 时, 你真的了解这个 name 属性吗? 其实每个属性背后都藏着一组"属性描述符"(Property Descriptor), 就像一个人的身份证信息一样记录着这个属性的详细特征. const obj { name: 张三 };const descriptor Object.getOwnPropert…

JavaScript异步编程的演进 - JavaScript学习系列文章

JavaScript异步编程的演进 - JavaScript学习系列文章

2026/8/25 11:55:06

一、 为什么需要异步编程? 先说说为什么要有异步这回事. JavaScript是单线程的, 也就是说它一次只能做一件事. 如果所有操作都同步执行, 遇到网络请求或者文件读取这种耗时的操作, 页面就会卡住不动, 用户体验直接爆炸. // 同步代码的灾难现场const data fetchDat…

JavaScript 中的原型与继承 - JavaScript学习系列文章

JavaScript 中的原型与继承 - JavaScript学习系列文章

2026/8/25 11:55:06

一、从对象说起, 一切皆对象 在 JS 中, 几乎所有的东西都是对象, 或者说最终都会指向某个对象. 比如: let arr [1, 2, 3];console.log(typeof arr); //"object"function foo() {}console.log(typeof foo); //"function" (但本质上也是对象) 简单的对象创建…

开源考试系统本地部署实战:从环境配置到联调排坑全指南

开源考试系统本地部署实战:从环境配置到联调排坑全指南

2026/8/25 11:55:06

1. 项目缘起:为什么要在本地折腾一个开源考试系统?如果你是一名开发者、教育技术从业者,或者是一个小团队的负责人,想搭建一个在线考试平台,大概率会先想到去网上找现成的开源项目。这个想法很对,毕竟从头造…

Python标准库:开箱即用的生产级工具箱与工程实践指南

Python标准库:开箱即用的生产级工具箱与工程实践指南

2026/8/25 11:45:06

1. 什么是Python标准库:不是“第三方”,而是你装完Python就自带的“出厂配置” 很多人第一次听说“Python标准库”,下意识会把它和pip install安装的requests、numpy、pandas混为一谈——这其实是个根本性误解。Python标准库(Pyt…

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

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

2026/8/24 19:53:32

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

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

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

2026/8/24 19:56:07

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

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

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

2026/8/24 21:16:09

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

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

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

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

2026/8/25 0:04:35

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

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

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

2026/8/25 0:04:35

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年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…