当前位置: 首页 > 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.jsqmd.com/news/919204/

相关文章:

  • OpenCore Legacy Patcher完整教程:3步让旧Mac重获新生的终极指南
  • 别再只盯着波形了!用示波器看眼图,手把手教你诊断高速信号质量(附Keysight实测)
  • 红日靶场实战复盘:从Weblogic反序列化到域内横向移动的完整攻击链分析
  • 别再傻傻用HAL_Delay了!STM32CubeMX实战:用SysTick实现非阻塞延时,让F103/F407多任务跑起来
  • 在openEuler 20.03 LTS SP3上编译内核踩坑记:FT2000+平台启动卡在EFI stub的排查与解决
  • 告别虚拟机!5分钟在Docker里跑起OpenVAS漏洞扫描器(附最新镜像拉取命令)
  • 2026年数据透视分析工具盘点:五家优选品牌深度解析 - 科技焦点
  • Linux系统管理员必看:安全审计后如何优雅地清理history与日志,避免误操作
  • 外卖配送机器人:技术架构、核心挑战与商业化落地实践
  • 别再手动点仿真了!用Makefile一键搞定VCS+VERDI联合仿真(附完整脚本)
  • 从游戏引擎到无人机:四元数解算欧拉角,为什么大家都用它而不用矩阵?
  • AutoDL远程桌面连接保姆级避坑指南:从VNC Viewer配置到SSH隧道稳定维护
  • 世界模型进入实时交互纪元?:Sora 2在3D动态场景生成中实现17ms端到端延迟的关键5步优化
  • 2026亚洲EMBA QS排名榜单解析:顶尖项目实力与择校指南 - 品牌2026推荐
  • 鞍山家庭教育指导师报名入口:官方授权机构中山优才教育报考指南 - 最新教育培训热点
  • Unity Timeline实战:用自定义轨道和Signal打造可交互的剧情对话系统
  • 【AI知识管理未来5大颠覆性趋势】:20年资深架构师独家预测,错过将淘汰下一代知识工作者
  • JGB37-520(12V 带编码器)电机 详细解析
  • 遍历s ,并用一个栈来表示括号的深度。
  • 2026年树洞聊天平台隐私实测:游戏中的心事同样要安全保护 - 时时资讯
  • HW蓝队实战:用HFish蜜罐在Windows上快速搭建一个“诱饵”服务器(附ThinkPHP服务配置)
  • 软考 系统架构设计师历年真题集萃(269)
  • Windows 11的WLAN图标不见了?别急着重装系统,试试这个设备管理器里的隐藏选项
  • 晋中家庭教育指导师报名入口与流程:推荐官方授权机构中山优才教育 - 实时教育培训动态
  • LangChain4j 如何实现 RAG(检索增强生成)?请简述完整流程及其核心组件。
  • 【AI工具版权避坑指南】:20年法律+技术双背景专家亲授3大高危场景与5步合规自查法
  • 校园失物招领系统原型设计——让每一件失物都能找到回家的路
  • 2026论文爆款降AI率软件大曝光:一键抹平AI痕迹稳过知网! - 降AI小能手
  • 别再只会点灯了!用STM32F407的PWM驱动舵机,做个会动的机械臂原型(附完整代码)
  • VAD不止于识别:聊聊语音端点检测在降噪、编码和IoT设备里的那些事儿