题意:
画布宽度为m,高度为n,以字符为单位,左下角坐标为(0,0),向右为x坐标增大的方向,向上为y坐标增大的方向。
现有两种操作:画线0 x1 y1 x2 y2,其中(x1,y1)和(x2,y2)分别是线段的两端,水平线段用’-‘来画,竖直线段用字符’|‘来画,若水平与竖直线相交,则用’+‘来画。题目保证线段都是水平或者竖直的。
填充1 x y c,其中(x,y)是起始位置,保证不会落在任何已有的线段上;要从起始位置开始用字符c填充位置,直到遇到画布边缘或已经画好的线段。注意相邻位置只需要考虑上下左右四个方向。
操作一共有q个,按照数据给出的顺序依次执行。画布最初时所有位置都是字符小数点’.’。要求输出最后得到的画图结果。
思路:
首先要创建画布map[100][100],此时应注意画布相对于题目的坐标系画布有所旋转。将map初始化为小数点.。
画线操作:判断线段是水平(y相同)还是竖直(x相同)的。比如线段是水平的,此时要判断x坐标,将小的放在x1,大的放在x2。然后从(x1,y1)到(x2,y1)依次判断,如果是’|’,把它变成’+’;如果是’+’,不变;不然就变为’-’。
填充操作:使用bfs或者dfs都可以。可以不用开标记数组,只要画布map当前位置变为字符c则可以判断已经标记。
最后的输出要注意画布方向,应从y=n-1~0, x=0~m-1进行输出。
总结:
一道CSP历年真题,思路很是简单,但要一次拿到100分还是很难的。题目有很多坑,比如画布的旋转,输出的顺序;画线时两个点可能坐标大的在前,小的在后,应交换;画线时可能只判断’-‘应变成’+‘而不是’|’,而没注意’+'要保持不变等等。做完题后一定要好好检查,防止爆零或者能拿100却拿一部分分。
代码:
#include <iostream>
#include <queue>
using namespace std;
int m,n,q;
char map[100][100]; //注意画布旋转
int dx[4]= {
0,1,0,-1},dy[4]= {
1,0,-1,0}; //上右下左
void swap(int &x,int &y)
{
int t=x;
x=y;
y=t;
}
struct point
{
int x,y;
point(int x1,int y1