CCF-CSP 2015-12-03
问题描述

输入格式
第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
第2行至第q + 1行,每行是以下两种形式之一:
0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
输出格式
输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
样例输入
4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A
样例输出
AAAA
A--A
样例输入
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C
样例输出
................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................
评测用例规模与约定
所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。
解题思路
本题在历年题目中属于比较简单的题目,需要注意的是,对于画线操作,遇到‘+’时不可修改。
main.cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void fillplant(string **plant, int m, int n,int x,int y,char temp)
{
if (y < 0 || y >= n)
return;
if (x < 0 || x >= m)
return;
if ((*plant)[y][x] == '-' || (*plant)[y][x] == '|' || (*plant)[y][x] == '+' || (*plant)[y][x] == temp)
{
return;
}
(*plant)[y][x] = temp;
fillplant(plant, m, n, x - 1, y, temp);
fillplant(plant, m, n, x + 1, y, temp);
fillplant(plant, m, n, x, y - 1, temp);
fillplant(plant, m, n, x, y + 1, temp);
}
int main() {
int m, n, q;
int mod;
int x1, y1, x2, y2;
char temp;
string *plant;
cin >> m >> n >> q; getchar();
plant = new string [n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
plant[i] = plant[i] + '.';
}
}
for (int i = 0; i < q; i++)
{
cin >> mod;
if (!mod)
{
cin >> x1 >> y1 >> x2 >> y2; getchar();
if (x1 == x2)
{
for (int i = min(y1, y2); i <= max(y1, y2); i++)
{
if (plant[i][x1] != '-' && plant[i][x1] != '+')
plant[i][x1] = '|';
else
plant[i][x1] = '+';
}
}
else if (y1 == y2)
{
for (int i = min(x1, x2); i <= max(x1, x2); i++)
{
if (plant[y1][i] != '|' && plant[y1][i] != '+')
plant[y1][i] = '-';
else
plant[y1][i] = '+';
}
}
}
else
{
cin >> x1 >> y1 >> temp; getchar();
fillplant(&plant, m, n, x1, y1, temp);
}
}
for (int i = n - 1; i >= 0; i--)
{
cout << plant[i] << endl;
}
getchar();
return 0;
}