当前位置: 首页 > 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.rkmt.cn/news/1430525.html

相关文章:

  • 红日靶场实战复盘:从Weblogic反序列化到域内横向移动的完整攻击链分析
  • 别再只盯着波形了!用示波器看眼图,手把手教你诊断高速信号质量(附Keysight实测)
  • 告别虚拟机!5分钟在Docker里跑起OpenVAS漏洞扫描器(附最新镜像拉取命令)
  • 在openEuler 20.03 LTS SP3上编译内核踩坑记:FT2000+平台启动卡在EFI stub的排查与解决
  • Linux系统管理员必看:安全审计后如何优雅地清理history与日志,避免误操作
  • AutoDL远程桌面连接保姆级避坑指南:从VNC Viewer配置到SSH隧道稳定维护
  • 世界模型进入实时交互纪元?:Sora 2在3D动态场景生成中实现17ms端到端延迟的关键5步优化
  • JGB37-520(12V 带编码器)电机 详细解析
  • 2026年树洞聊天平台隐私实测:游戏中的心事同样要安全保护 - 时时资讯
  • 软考 系统架构设计师历年真题集萃(269)
  • Windows 11的WLAN图标不见了?别急着重装系统,试试这个设备管理器里的隐藏选项
  • 别再只会点灯了!用STM32F407的PWM驱动舵机,做个会动的机械臂原型(附完整代码)
  • VAD不止于识别:聊聊语音端点检测在降噪、编码和IoT设备里的那些事儿
  • 基于Arduino与Dynamixel的智能遥控拖船:集成4DOF机械臂与FPV的机器人平台实践
  • 向量数据库响应延迟飙至8s?不是QPS过高——揭秘Milvus/Weaviate底层Segment分裂引发的隐性阻塞(仅头部12家AI平台知晓)
  • 终极MapleStory游戏资源编辑器:5步轻松打造专属游戏世界
  • JMeter汇总报告保姆级解读:从‘样本’到‘吞吐量’,每个参数到底在说什么?
  • 185、运动控制中的行业应用:AGV与移动机器人
  • 技术人如何高效处理信息流:从AI、比特币到StoreKit 2的实践思考
  • DouyinLiveWebFetcher:抖音直播数据采集的终极解决方案
  • 数据库原理选择题精选
  • 别再只改SE11了!ABAP搜索帮助增强的完整流程:从创建、分配到调试的避坑指南
  • Linux动态链接库缺失导致FlexNet许可证服务器启动失败的解决方案
  • 告别环境报错:用Docker一键部署MMDetection3D开发环境(支持PyTorch 1.10.1 + CUDA 11.3)
  • Gemini多模态视频分析落地全链路(企业级部署避坑手册)
  • 好用还专业!2026年最值得体验的专业降AI率工具
  • 告别ViT的‘暴力计算’:手把手教你用PyTorch实现MViT的池化注意力(附代码)
  • 从零搭建一个私有化单点登录中心:基于Docker部署Casdoor全记录(含MySQL配置与HTTPS证书)
  • 告别复制粘贴!用Automa插件把网页表格数据一键存入MySQL(附完整Java后端代码)
  • League Akari:英雄联盟玩家的3大智能助手完整指南