问题描述
问题分析
本题单纯为填充和字符覆盖操作
‘-’和‘|’可以覆盖’.’,当两者相遇时,相互覆盖为‘+’,‘+’的优先级最高,不能被其他字符覆盖
在填充指定字符的时候,利用BFS填充,多次填充时后者指定字符可以覆盖前序指定字符
代码块错误信息
1、scanf("%d %d %c",&a,&b,&c)语法报错信息,输入输出要保持一致,不加空格会导致输入时字符变量读入空格
2、填充判断时,不能单纯判断是否为点然后覆盖,要考虑多次覆盖的情况
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct position
{
int x,y;
};
char c[101][101];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m,q,flag;
void draw(int x1,int y1,int x2,int y2)//线的优先级比填充优先级高
{
int min_y,max_y,min_x,max_x;
if(y1==y2&&x1!=x2)//"-"
{
min_x=min(x1,x2);
max_x=max(x1,x2);
for(int i=min_x;i<=max_x;i++)
{
if(c[i][y1]!='+')
{
if(c[i][y1]=='|')
c[i][y1]='+';
else c[i][y1]='-';
}
}
}
if(x1==x2&&y1!=y2)//"|"
{
min_y=min(y1,y2);
max_y=max(y1,y2);
for(int i=min_y;i<=max_y;i++)
{
if(c[x1][i]!='+')
{
if(c[x1][i]=='-')
c[x1][i]='+';
else c[x1][i]='|';
}
}
}
}
void fill(int x3,int y3,char ch)
{
queue<position> que;
position p,q;
p.x=x3;
p.y=y3;
c[x3][y3]=ch;
que.push(p);
while(!que.empty())
{
q=que.front();
que.pop();
for(int i=0;i<4;i++)
{
position next;
next.x=q.x+dir[i][0];
next.y=q.y+dir[i][1];
if(next.x>=0&&next.x<m&&next.y>=0&&next.y<n)
{
if(c[next.x][next.y] !='-'&& c[next.x][next.y] != '|'&& c[next.x][next.y] != '+'&&c[next.x][next.y]!=ch)//前面可能被其他字符覆盖不能单独判断是否为点
{
c[next.x][next.y]=ch;
que.push(next);
}
}
}
}
}
int main()
{
memset(c,'.',sizeof(c));
scanf("%d%d%d",&m,&n,&q);
for(int i=0;i<q;i++)
{
scanf("%d",&flag);
if(flag==0)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
draw(x1,y1,x2,y2);
}
if(flag==1)
{
int x3,y3;
char ch;
scanf("%d %d %c",&x3,&y3,&ch);//语法报错点
fill(x3,y3,ch);
}
}
for(int i=n-1;i>=0;i--)//m是宽度n是高度
{
for(int j=0;j<m;j++)
{
printf("%c", c[j][i]);
}
cout<<endl;
}
}