分析
- 当操作为画线段时,要判断是横坐标还是纵坐标相同,之后把线段进行赋值。
- 当操作为画符号时,就利用Flood Fill(bfs)进行画图
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
const int N = 110;
int n,m,q;
char g[N][N];
bool st[N][N];
struct node{
int x,y;
};
void bfs(int x,int y,char c) //flood fill画图
{
st[x][y] = true;
g[x][y]=c;
queue<node> q;
q.push({x,y});
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=t.x+dx[i],yy=t.y+dy[i];
if(xx<0 || xx>=n || yy<0 || yy>=m || g[xx][yy]=='|' || g[xx][yy]=='-' || g[xx][yy]=='+' || st[xx][yy]) continue;
g[xx][yy]=c;
st[xx][yy]=true;
q.push({xx,yy});
}
}
}
int main()
{
cin>>n>>m>>q;
for(int i=0;i<n+1;i++)
for(int j=0;j<m+1;j++)
g[i][j]='.';
int op,x_1,y_1,x_2,y_2;
while(q--)
{
cin>>op;
if(op==0) //画线段
{
cin>>x_1>>y_1>>x_2>>y_2;
if(x_1>x_2) swap(x_1,x_2); //保证区间是从小到大
if(y_1>y_2) swap(y_1,y_2); //保证区间是从小到大
char c = '-', d = '|';
if (x_1==x_2) swap(c, d);
for(int i=x_1;i<=x_2;i++)
{
for(int j=y_1;j<=y_2;j++)
{
if(g[i][j]==d || g[i][j]=='+') g[i][j]='+';
else g[i][j]=c;
}
}
}
else{ //画图
char c;
cin>>x_1>>y_1>>c;
memset(st,0,sizeof st);
if(g[x_1][y_1]!='|' && g[x_1][y_1]!='-' && g[x_1][y_1]!='+')
bfs(x_1,y_1,c);
}
}
for(int i=m-1;i>=0;i--) //最后要倒着输出
{
for(int j=0;j<n;j++)
{
cout<<g[j][i];
}
cout<<endl;
}
return 0;
}