CCF-CSP 2015-12-03 画图

CCF-CSP 2015-12-03

问题描述

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;

//Insert Character
void fillplant(string **plant, int m, int n,int x,int y,char temp)
{
	//Out Of Memory
	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;
	//Insert Around
	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];
	//Init '.'
	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)
			{
				//y1!=y2
				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)
			{
				//x1!=x2
				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--)
	{	//Reverse output
		cout << plant[i] << endl;
	}
	getchar();
	return 0;
}