题意:
用ASCII画字符,
思路:
这道题乍一看有点难理解,而且结果也很复杂,但仔细一分析,便知为一道bfs题目,而且填充时用到bfs。
首先我们总体的约束条件为不能超过边界,遇到线段即为截止,而对于每一次bfs来说,用一个visit数组来约束自己还能走的位置,一直遍历到队列为空,当然不同bfs之间的visit数组不能共用,所以bfs之前要memset visit。
对于画线部分,考虑之前已有线段的状态,来决定画完后线段的状态。
最后按要求的顺序输出即可。
代码:
#include<bits/stdc++.h>
#include<queue>
using namespace std;
char mapp[105][105];
int vis[105][105];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int m,n,p;
struct node
{
int a,b;
node(int q,int p)
{
a=q;b=p;
}
node(){}
};
void swap(int &a,int &b)
{
int t;
if(a>b)
{
t=a;
a=b;
b=t;
}
}
void bfs(int a,int b,char c)
{
queue<node> q;
int f,g,ff,gg;
node now(a,b);
q.push(now);
//mapp[a][b]=c;
//vis[a][b]=1;
memset(vis,0,sizeof(vis));
while(!q.empty())
{
now=q.front();q.pop();
f=now.a;
g=now.b;
for(int i=0;i<4;i++)
{
ff=f+dx[i];
gg=g+dy[i];
if(ff<0||ff>=m||g<0||g>=n)
continue;
if(vis[ff][gg]==1)
continue;
if(mapp[ff][gg]=='+')
continue;
if(mapp[ff][gg]=='-')
continue;
if(mapp[ff][gg]=='|')
continue;
node now(ff,gg);
vis[ff][gg]=1;
mapp[ff][gg]=c;
q.push(now);
}
}
}
void pri()
{
for(int j=n-1;j>=0;j--)
{
for(int i=0;i<m;i++)
{
cout << mapp[i][j];
}
cout << endl;
}
}
int main()
{
int x1,x2,y1,y2,s;
char c;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&m,&n,&p);
for(int i=0;i<=100;i++)
{
for(int j=0;j<=100;j++)
{
mapp[i][j]='.';
}
}
for(int i=0;i<p;i++)
{
scanf("%d",&s);
if(s==0)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2)
{
swap(y1,y2);
for(int j=y1;j<=y2;j++)
{
if(mapp[x1][j]=='+'||mapp[x1][j]=='|')
continue;
else if(mapp[x1][j]=='-')
mapp[x1][j]='+';
else
mapp[x1][j]='|';
}
}
if(y1==y2)
{
swap(x1,x2);
for(int j=x1;j<=x2;j++)
{
if(mapp[j][y1]=='+'||mapp[j][y1]=='-')
continue;
else if(mapp[j][y1]=='|')
mapp[j][y1]='+';
else
mapp[j][y1]='-';
}
}
}
if(s==1)
{
cin >> x1 >> y1 >> c;
bfs(x1,y1,c);
}
}
pri();
//cout << mapp[1][1] << mapp[1][2];
}