sgu166:Editor
2014-12-14 13:27
134 查看
题意:
写一个文本编辑器,支持以下操作:
1. 小写字母或空格:插入该字符(光标后移一位)。
2. L:光标左移一位。若在行首则不动。
3. R:光标右移一位,可超出行末。若在光标超出行末时插入了字符,则补之前的空格。
4. U:光标上移一行。若在首行则不动。
5. D:光标下移一行。若在末行则不动。
6. N:在当前行下方新建一行,内容为当前行光标后的内容,然后光标移动到新行首。(其实就是回车)
7. E:光标移动到行末。
8. H:光标移动到行首。
9. X:删除光标后字符。若光标超出行末则把下一行连上来并补空格,没有下一行不操作。(其实就是Delete)
10. B:删除光标前字符(光标前移一位)。若光标在行首则连到上一行上,然后光标移动到上一行原行末,没有上一行不操作。
11. Q:结束编辑器并输出当前文本。
文本最后一行后不能输出换行。每行字符数不超过1000,命令数不超过20480.(翻译来自:http://txhwind.blog.163.com/blog/static/20352417920130187529368/)
分析:
利用vector的insert、erase操作可以比较方便做这道题。
写一个文本编辑器,支持以下操作:
1. 小写字母或空格:插入该字符(光标后移一位)。
2. L:光标左移一位。若在行首则不动。
3. R:光标右移一位,可超出行末。若在光标超出行末时插入了字符,则补之前的空格。
4. U:光标上移一行。若在首行则不动。
5. D:光标下移一行。若在末行则不动。
6. N:在当前行下方新建一行,内容为当前行光标后的内容,然后光标移动到新行首。(其实就是回车)
7. E:光标移动到行末。
8. H:光标移动到行首。
9. X:删除光标后字符。若光标超出行末则把下一行连上来并补空格,没有下一行不操作。(其实就是Delete)
10. B:删除光标前字符(光标前移一位)。若光标在行首则连到上一行上,然后光标移动到上一行原行末,没有上一行不操作。
11. Q:结束编辑器并输出当前文本。
文本最后一行后不能输出换行。每行字符数不超过1000,命令数不超过20480.(翻译来自:http://txhwind.blog.163.com/blog/static/20352417920130187529368/)
分析:
利用vector的insert、erase操作可以比较方便做这道题。
#include <cstdio> #include <vector> using namespace std; vector<char> com[20489]; int main() { int x = 1, y = 1, line = 1; bool flag = 0; char c; while(~scanf("%c", &c)) { if((c >= 'a' && c <= 'z') || c == ' ') { int len = com[x-1].size(); if(y > len) { for(int i = len; i < y-1; ++i) com[x-1].push_back(' '); com[x-1].push_back(c); ++y; } else { com[x-1].insert(com[x-1].begin()+y-1, c); ++y; } } else if(c == 'L') { if(y > 1) --y; } else if(c == 'R') ++y; else if(c == 'U') { if(x > 1) --x; } else if(c == 'D') { if(x < line) ++x; } else if(c == 'N') { int end = line, len = com[x-1].size(); for(; end > x; --end) com[end] = com[end-1]; com[x].clear(); if(y <= len) { for(int k = y-1; k < len; ++k) com[x].push_back(com[x-1][k]); com[x-1].resize(y-1); } ++x;y = 1; line++; } else if(c == 'E') y = com[x-1].size()+1; else if(c == 'H') y = 1; else if(c == 'X') { int len = com[x-1].size(); if(y > len) { if(x < line) { for(int i = len; i < y-1; ++i) com[x-1].push_back(' '); len = com[x].size(); for(int i = 0; i < len; ++i) com[x-1].push_back(com[x][i]); for(int i = x+2; i <= line; ++i) com[i-2] = com[i-1]; com[--line].clear(); } } else { com[x-1].erase(com[x-1].begin()+y-1); } } else if(c == 'B') { int len = com[x-1].size(); if(y > len+1 && len) --y; else if(y > 1) { com[x-1].erase(com[x-1].begin()+y-2); --y; } else { if(x > 1) { y = com[x-2].size()+1; for(int i = 1; i <= len; ++i) com[x-2].push_back(com[x-1][i-1]); for(int i = x; i < line; ++i) com[i-1] = com[i]; com[--line].clear(); --x; } } } else if(c == 'Q') break; } for(int i = 0; i < line; ++i) { for(int j = 0, lim = com[i].size(); j < lim; ++j) printf("%c", com[i][j]); if(i < line-1) printf("\n"); } return 0; }
相关文章推荐
- GEF小技巧之设定GraphicalEditor中图元为选中状态
- Unreal Engine Editor targeted RHI是什么
- 扩展 Unity的 TextureImporterEditor
- 利用jTessBoxEditor工具进行Tesseract3.02.02样本训练
- Springmvc PropertyEditor实现绑定时的类型转换
- reactjs simple text editor
- Unity Editor 编辑器扩展三 Unity Editor 数据持久化及Editor窗口的初识
- 如何排版 微信公众号「代码块」之 MarkEditor
- RCP开发中workbench和editor
- KindleEditor上传文件报404
- spring mvc的表单类型转换(custom property editor)
- UnityEditor扩展 - 编辑器中的内置属性Attribute
- datatables-editor——API
- 在Unity内制作工具(1)--MenuItem,Resouces.FindObjectsofTypeAll<>与EditorWindow自制编辑器窗口
- Easyui笔记4:实现表格内combobox数据的动态切换(getEditor的使用)
- ACE Editor在线代码编辑器简介及使用引导
- Editor does not contain a main type错误提示,怎么解决?
- Free browsing:如何阅读源代码/项目:Editor.md
- Unity Editor 基础篇(四):Handles
- [置顶] Swagger-Editor开发环境搭建