当前位置: 首页 > news >正文

UVa 337 Interpreting Control Sequences

题目描述

几乎所有文本模式终端都是专用的计算机系统,包含串行端口、键盘、CRT\texttt{CRT}CRT、微处理器、RAM\texttt{RAM}RAMROM\texttt{ROM}ROM中的控制程序。

当字符到达终端时(无论是来自键盘还是串行端口),终端的软件将其分类为显示字符(将显示在CRT\texttt{CRT}CRT上)或控制序列引入字符。控制序列用于指示终端执行诸如清屏、移动光标、更改字体等操作。

在本题中,假设你在为一个具有101010101010列显示屏的小型终端编写软件。行和列编号为000999。控制序列的引入字符是^(脱字符)。紧随控制序列引入符的字符(或两个字符)将指示软件执行特殊功能。

控制序列列表

序列功能
^b将光标移动到当前行的开头;光标行不变
^c清空整个屏幕;光标行和列不变
^d如果可能,将光标向下移动一行;光标列不变
^e擦除光标行上从光标列开始到行尾的字符;光标行和列不变
^h将光标移动到(0,0)(0,0)(0,0);屏幕内容不变
^i进入插入模式
^l如果可能,将光标向左移动一列;光标行不变
^o进入覆盖模式
^r如果可能,将光标向右移动一列;光标行不变
^u如果可能,将光标向上移动一行;光标列不变
^^在当前光标位置写入一个脱字符(^),就像它不是特殊字符一样;受当前模式影响
^##将光标移动到指定行和列;#表示十进制数字,第一个#是新行号,第二个#是新列号

显示字符处理

  • 覆盖模式(初始模式):接收的字符替换光标位置的字符
  • 插入模式:光标位置及右侧的字符向右移动一列,新字符放置在光标位置;光标行最右侧的字符丢失
  • 无论何种模式,光标都会向右移动一列(如果可能)

输入格式

输入包含多个测试用例。每个测试用例以一行包含整数NNN开始。接下来NNN行数据,每行的每个字符按读取顺序输入终端软件。输入数据中不含制表符,行结束符应被忽略。空白字符是正常的显示字符。最后一个测试用例后跟一行包含整数0

每个测试用例开始时,屏幕是空的(全部为空格),终端处于覆盖模式,光标在(0,0)(0,0)(0,0)

输出格式

对于每个测试用例,输出一行用例编号,然后将屏幕图像用“框”包围输出,格式如样例所示。

样例输入

7 This is bad^h^c ^05^^ ^14/ \^d^b / \ ^u^d^d^l^l^l^l^l^l^l^l^l ^r^r< ACM >^l^l^d/^b \ ^b^d \ / ^d^l^lv 7 ^i9^l8^l7^l6^l5^l4^l3^l2^l1^l0 ^o^d^lThis is #1^d^bThis is #2 ^d^bThis is #3^d^bThis is #4 ^d^bThis is #5^d^bThis is #6 ^d^bThis is #7^d^bThis is #8 ^i^d^bThis is #9^d^bThis is #10 ^54^e Hello^d^l^l^l^lWorld 0

样例输出

Case 1 +----------+ | | | | | | | | | | | | | | | | | | | | +----------+ Case 2 +----------+ |0123456789| |This is #1| |This is #2| |This is #3| |This is #4| |This Hello| |This World| |This is #7| |This is #8| |This is #0| +----------+

题目分析

问题的本质

这是一个终端模拟器的实现问题。需要模拟一个10×1010 \times 1010×10的字符终端,处理:

  1. 普通字符的显示(覆盖/插入模式)
  2. 控制序列的执行(光标移动、清屏、擦除、模式切换等)

终端状态

需要维护三个状态:

  • 屏幕内容10×1010 \times 1010×10的字符数组,初始全为空格
  • 光标位置(row, column),初始为(0,0)(0,0)(0,0)
  • 模式:覆盖模式(OVERWRITE\texttt{OVERWRITE}OVERWRITE)或插入模式(INSERT\texttt{INSERT}INSERT),初始为覆盖模式

控制序列解析

解析输入的字符流,遇到^时,开始解析控制序列:

  • 如果下一个字符是^,则表示显示一个脱字符
  • 如果下一个字符是数字(0~9),则表示^##格式,读取两个数字作为新坐标
  • 否则,根据控制字符执行对应操作

插入模式的实现

在插入模式下,向光标位置插入字符时,需要将光标位置及右侧的字符向右移动一列:

for(intc=9;c>column;c--)bitmap[row][c]=bitmap[row][c-1];bitmap[row][column]=character;

光标移动边界

光标不能移出屏幕范围(0≤row≤90 \leq row \leq 90row90≤column≤90 \leq column \leq 90column9)。


参考代码

// Interpreting Control Sequences// UVa ID: 337// Verdict: Accepted// Submission Date: 2016-07-01// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintOVERWRITE=1,INSERT=2;charbitmap[10][10];// 屏幕内容intmode=OVERWRITE;// 当前模式introw=0,column=0;// 光标位置// 覆盖模式:直接替换光标处字符voidoverwrite(charcharacter){bitmap[row][column]=character;}// 插入模式:将光标及右侧字符右移,然后放入新字符voidinsert(charcharacter){for(intc=9;c>column;c--)bitmap[row][c]=bitmap[row][c-1];bitmap[row][column]=character;}intmain(intargc,char*argv[]){ios::sync_with_stdio(false);intn,cases=0;string line;while(getline(cin,line)){n=stoi(line);if(n==0)break;// 初始化终端状态mode=OVERWRITE;row=0;column=0;memset(bitmap,' ',sizeof(bitmap));// 处理 N 行输入for(inti=1;i<=n;i++){getline(cin,line);intposition=0;while(position<line.length()){if(line[position]=='^'){position++;// 跳过 '^'if(line[position]=='b'){column=0;}elseif(line[position]=='c'){memset(bitmap,' ',sizeof(bitmap));}elseif(line[position]=='d'){row=row<9?(row+1):row;}elseif(line[position]=='e'){for(intc=column;c<=9;c++)bitmap[row][c]=' ';}elseif(line[position]=='h'){row=0,column=0;}elseif(line[position]=='i'){mode=INSERT;}elseif(line[position]=='l'){column=column>0?(column-1):column;}elseif(line[position]=='o'){mode=OVERWRITE;}elseif(line[position]=='r'){column=column<9?(column+1):column;}elseif(line[position]=='u'){row=row>0?(row-1):row;}elseif(line[position]=='^'){// 显示脱字符if(mode==OVERWRITE)overwrite('^');elseinsert('^');column=column<9?(column+1):column;}else{// ^## 格式:移动到指定位置row=line[position]-'0';position++;column=line[position]-'0';}}else{// 普通字符if(mode==OVERWRITE)overwrite(line[position]);elseinsert(line[position]);column=column<9?(column+1):column;}position++;}}// 输出结果cout<<"Case "<<++cases<<endl;cout<<"+----------+"<<endl;for(inti=0;i<10;i++){cout<<'|';for(intj=0;j<10;j++)cout<<bitmap[i][j];cout<<'|'<<endl;}cout<<"+----------+"<<endl;}return0;}
http://www.cnnetsun.cn/news/2664718.html

相关文章:

  • 旧笔记本改造模拟合成器:VCO电路设计与DIY电子实践
  • 别再死记硬背了!用‘找书’和‘找章节’的比喻,5分钟搞懂Linux虚拟内存的一二级页表
  • 别再死记硬背了!STM32CubeMX配置GPIO时,上拉/下拉/浮空到底怎么选?
  • 别再只用Solution Explorer了!用VS2022的Class View重构和阅读代码,效率翻倍
  • 手把手调试Android PIP转全屏:用Logcat和源码定位PipTaskOrganizer与WindowOrganizer的协作
  • VAD不止于识别:聊聊语音端点检测在降噪、编码和IoT设备里的那些事儿
  • 基于ESP8266与继电器模块构建安全远程家电控制器
  • 药物设计实战:如何用AMBER分析抑制剂与HIV蛋白酶的结合稳定性(RMSF、SASA、聚类全解析)
  • 多核时代弱内存模型与并发编程实践
  • 7张图搞懂Claude Code的Harness架构设计
  • 垂直智能体应用指南:三步搭建必备技能
  • 机器学习与人类学习的本质差异:从模式匹配到意义构建
  • 【2025知识管理生存白皮书】:基于全球47家头部科技企业实测数据,揭示AI知识系统ROI拐点在第87天
  • 别再删库重Fork了!Gitee同步上游代码的3种正确姿势(附Git命令详解)
  • MKS Monster8 8轴3D打印主板终极指南:从零配置到高性能打印
  • 2026实测:专业降AI率网站选它准没错
  • HS2-HF_Patch终极指南:新手如何快速安装Honey Select 2汉化去码补丁
  • R语言绘图进阶:巧用ComplexHeatmap的`draw()`函数统一控制多个热图
  • 人机融合的兼容性挑战:从生物相容性到脑机接口的破局之路
  • 量子纠错码硬件实现与HAL算法解析
  • AI检测太高论文过不了?这4个降AI率工具2026年必须用!
  • 为什么你需要VS Code Markdown Mermaid扩展?3个痛点与解决方案
  • ROS2 Humble实战:用思岚A2激光雷达构建你的第一个SLAM感知节点
  • ProtoTTA:利用原型网络可解释性信号实现鲁棒的测试时适应
  • 新手避坑指南:用立创EDA从零画一块STM32F103RCT6核心板(附完整原理图+PCB源文件)
  • AI工具版本迭代风暴(2024Q3实测预警清单):ChatGPT-4.5、Claude-3.7、Gemini 2.0更新节奏全图谱
  • 终极宝可梦Switch ROM编辑指南:用pkNX打造你的专属冒险世界 ✨
  • OpenCore Configurator:黑苹果引导配置的图形化解决方案
  • HY-World 2.0:从多模态输入到可交互3D世界的生成与重建技术解析
  • CANoe硬件配置踩坑实录:从canSetConfiguration返回值0到成功配置的排查指南