题目
思路
本体比较简单主要就两个操作:画线和填充;画线比较简单,用for循环和if判断即可;填充操作用的是dfs填充的方法,如果不碰到边界和线段就填充,并且记录vis数组为已经访问。反而我觉得最绕的是输出,想象二维数组的(0,0)在左上角,坐标系的在左下角。
代码
#include <iostream>
#include<string.h>
#define MAX 105
using namespace std;
int m,n,q;
int x1,x2,y1,y2;
char map[MAX][MAX];
bool vis[MAX][MAX];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
void line() //画线
{
if(x1==x2)
{
if(y2>y1)
swap(y1,y2);
for(int i=y2;i<=y1;i++)
{
if(map[x1][i]!='-'&&map[x1][i]!='+')
map[x1][i] = '|';
else
map[x1][i]='+';
}
}
else if(y1==y2)
{
if(x2>x1)
swap(x1,x2);
for(int i=x2;i<=x1;i++)
{
if(map[i][y1]!='|'&&map[i][y1]!='+')
map[i][y1] = '-';
else
map[i][y1]='+';
}
}
}
void fill(int x,int y,char c) //填充
{
if(x<0||x>=m||y<0||y>=n)
return;
if(map[x][y]== '-'||map[x][y]== '|'||map[x][y]== '+'||vis[x][y])
return;
map[x][y]=c;
vis[x][y]=true;
for(int i=0;i<4;i++)
{
fill(x+dx[i],y+dy[i],c);
}
}
int main()
{
cin>>m>>n>>q;
memset(map,'.',sizeof(map));
for(int i=0;i<q;i++)
{
int op;
cin>>op;
if(op==1)
{
int x,y;
char c;
cin>>x>>y>>c;
memset(vis,false,sizeof(vis));
fill(x,y,c);
}
else if(op==0)
{
cin>>x1>>y1>>x2>>y2;
line();
}
}
for(int i = n-1; i >= 0; i--)
{
for(int j=0;j<m;j++)
{
cout<<map[j][i];//注意输出的方式,想象二维数组的(0,0)在左上角,坐标系的在左下角
}
cout<<endl;
}
return 0;
}