试题编号: | 201512-3 |
试题名称: | 画图 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。 输入格式 第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。 输出格式 输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。 样例输入 4 2 3 样例输出 AAAA 样例输入 16 13 9 样例输出 ................ 评测用例规模与约定 所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。 |
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <stack>
using namespace std;
struct Pos {
int x, y;
Pos(int xx, int yy)
{
x = xx; y = yy;
}
};
char Draw[101][101];
int Near[4][2] = { { 0, 1 },{ 0, -1 },{ 1, 0 },{ -1, 0 } };
int N, M;
bool Judge(int x, int y)
{
if (Draw[x][y] == '-' || Draw[x][y] == '|' || Draw[x][y] == '+')
return 0;
else if (x > N || y > M || x < 0 || y < 0)
return 0;
else
return 1;
}
int Con(int x,int N)
{
return N - x - 1;
}
int main()
{
int i, p, k, Q;
//m和n分别表示画布的宽度和高度,q表示画图操作的个数
cin >> M >> N >> Q;
memset(Draw, '.', sizeof(Draw));
bool Flag;
int X1 , Y1 , X2 , Y2;
char C;
for (i = 1; i <= Q; i++)
{
cin >> Flag;
switch (Flag)
{
case 0:
cin >> X1 >> Y1 >> X2 >> Y2;
if (X1 == X2)
if (Y1 > Y2)
for (p = Con(Y1,N); p <= Con(Y2, N); p++)
{
if (Draw[p][X1] == '-')
Draw[p][X1] = '+';
else
Draw[p][X1] = '|';
}
else
for (p = Con(Y2, N); p <= Con(Y1, N); p++)
{
if (Draw[p][X1] == '-')
Draw[p][X1] = '+';
else
Draw[p][X1] = '|';
}
else
if (X1 > X2)
{
for (p = X2; p <= X1; p++)
{
if (Draw[Con(Y1, N)][p] == '|')
Draw[Con(Y1, N)][p] = '+';
else
Draw[Con(Y1, N)][p] = '-';
}
}
else
for (p = X1; p <= X2; p++)
{
if (Draw[Con(Y1, N)][p] == '|')
Draw[Con(Y1, N)][p] = '+';
else
Draw[Con(Y1, N)][p] = '-';
}
break;
case 1:
cin >> X1 >> Y1 >> C;
p = Con(Y1, N);
k = X1;
bool flag[101][101];
memset(flag, 0, sizeof(flag));
queue<Pos> Save;
flag[p][k] = 1;
Draw[p][k] = C;
Save.push(Pos(p, k));
while (!Save.empty())
{
Pos P = Save.front();
Save.pop();
for (p = 0; p < 4; p++)
{
int xlim = P.x + Near[p][0], ylim = P.y + Near[p][1];
if (Judge(xlim, ylim) && !flag[xlim][ylim])
{
flag[xlim][ylim] = 1;
Draw[xlim][ylim] = C;
Save.push(Pos(xlim, ylim));
}
}
}
break;
}
}
for (i = 0; i < N; i++)
{
for (p = 0; p < M; p++)
cout << Draw[i][p];
cout << endl;
}
cin >> N;
return 0;
}