思路:考虑到进行填充时如果坐标在±|组成的封闭区间之外,则里面不会被填充,所以这与bfs的作用相同,可以用bfs进行搜索填充
总结:这是一道模拟题,重要的是将坐标内容转换成数组形式,考虑到用bfs进行填充
反思:利用数组存储与坐标之间的转换!
(x,y)—>vis[y][x]
代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
char a[110][110];
int vis[110][110];
int m,n,q;
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
struct point
{
int x,y;
};
void fillbfs(int sx,int sy,char c)
{
queue<point>q;point p;p.x=sy;p.y=sx;q.push(p);vis[sy][sx]=2;a[sy][sx]=c;
while(!q.empty())
{
point now=q.front();q.pop();
for(int i=0;i<4;i++)
{
int x=now.x+dx[i];int y=now.y+dy[i];
if(vis[x][y]!=1&&vis[x][y]!=2&&x>=0&&x<n&&y>=0&&y<m)
{
vis[x][y]=2;a[x][y]=c;point newp;newp.x=x;newp.y=y;
q.push(newp);
}
}
}
}
int main()
{ memset(vis,0,sizeof(vis));
cin>>m>>n>>q;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i][j]='.';
}
}
for(int i=1;i<=q;i++)
{
bool x;cin>>x;
if(x)
{
//填充
int sx,sy;char c;
cin>>sx>>sy>>c;
fillbfs(sx,sy,c);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(vis[i][j]==2) vis[i][j]=0;
}
else
{
int x1,x2,y1,y2;cin>>x1>>y1>>x2>>y2;//坐标与矩阵存储 x1,y1对应vis[y1][x1]
//坐标转换
if(x1==x2)
{
int mmax=max(y1,y2);int mmin=min(y1,y2);
for(int j=mmin;j<=mmax;j++)
{ if(a[j][x1]=='-'||a[j][x1]=='+')
a[j][x1]='+';
else
a[j][x1]='|';
vis[j][x1]=1;
}
}
else
{
int mmax=max(x1,x2);int mmin=min(x1,x2);
for(int j=mmin;j<=mmax;j++)
{ if(a[y1][j]=='|'||a[y1][j]=='+')//注意题目中说|与—相交为+且对于一个点没有提到不会重复画线//
//所以存在- | -+ |+情况 没有提到就是可能存在
a[y1][j]='+';
else
a[y1][j]='-';
vis[y1][j]=1;
}
}
}
} for(int i=n-1;i>=0;i--)
{ for(int j=0;j<=m-1;j++)
cout<<a[i][j];
cout<<endl;
}
return 0;
}