题目
原题传送门
题目思路
1、形成画布,根据输入长宽初始化画布,将全部像素都初始化为 '.'
2、输入操作,根据输入的q个操作依次对画布进行修改
w = 0 :画线段操作,根据输入的x1,y1,x2,y2进行画'|'和'-',通过当前点的状态判断是否更改为'+'
·y1 == y2 横线
·x1 == x2 竖线
w = 1:填充操作,根据输入的x,y,c利用递归方法进行填充
3、画图完成后,按顺序输出画布上的画。
此题需要注意坐标系的表示,明确x轴与y轴;
另外,对于画线段操作何时画'+'的操作判断需要注意,画竖线时只需要判断当前点的状态是否是'+'或’-‘,若是则画'+',对于重复画竖线的地方最后结果应仍然是竖线。
代码实现
#include<bits/stdc++.h>
using namespace std;
int m,n,q,w;
char a[105][105];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
void dfs(int x,int y,char c)
{
a[y][x]=c;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(a[yy][xx]!='|' && a[yy][xx]!='-' && a[yy][xx]!='+' && a[yy][xx]!=c &&(xx<m&&xx>=0) && (yy>=0&&yy<n))
dfs(xx,yy,c);
}
return;
}
int main()
{
scanf("%d %d %d",&m,&n,&q);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]='.';
for(int i=0;i<q;i++)
{
scanf("%d",&w);
if(w==0)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(x1==x2)
{
for(int z=min(y1,y2);z<=max(y1,y2);z++)
{
if(a[z][x1]=='-' || a[z][x1]=='+')
a[z][x1]='+';
else
a[z][x1]='|';
}
}
else if(y1==y2)
{
for(int z=min(x1,x2);z<=max(x1,x2);z++)
{
if(a[y1][z]=='|' || a[y1][z]=='+')
a[y1][z]='+';
else
a[y1][z]='-';
}
}
}
if(w==1)
{
int x,y;
char c;
scanf("%d %d %c",&x,&y,&c);
dfs(x,y,c);
}
}
for(int y=n-1;y>=0;y--)
{
for(int x=0;x<m;x++)
{
printf("%c",a[y][x]);
}
printf("\n");
}
return 0;
}