您的位置:首页 > 其它

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操作可以比较方便做这道题。
#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;	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: