CSP201512-3 画图
思路
做个题复习一下前面的bfs(此题是填充,dfs也可)
划线就是很简单的判断,注意划了线之后就一定不能被填充所以相当于墙,这里用wall数组表示;
填充用到bfs,注意边界,墙和已经填充过的点;
注意:题目视左下角为(0,0),所以要上下翻转一下;m是列数,n是行数,容易搞反。
踩的坑:一开始只把全局数组多开了,忘了把下边是局部变量的标记数组been开大一点,喜提九十大分。
Answer
具体思路见注释
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int m,n,q;
char r[105][105];
bool wall[105][105]={0};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void drawaline(){
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(x1==x2){
int x=x1;
int b=min(y1,y2);
int e=max(y1,y2);
for(int i=b;i<=e;i++){
wall[i][x]=1;
if(r[i][x]=='-')r[i][x]='+';
if(r[i][x]!='|'&&r[i][x]!='+')r[i][x]='|';
}
}
if(y1==y2){
int y=y1;
int b=min(x1,x2);
int e=max(x1,x2);
for(int i=b;i<=e;i++){
wall[y][i]=1;
if(r[y][i]=='|')r[y][i]='+';
if(r[y][i]!='-'&&r[y][i]!='+')r[y][i]='-';
}
}
}
void fill(){
int x,y;char c;
bool been[105][105]={0};
scanf("%d %d %c",&x,&y,&c);
queue<pair<int,int> > q;
pair<int ,int> p;
p.first=y;p.second=x;
q.push(p);
been[p.first][p.second]=1;
while(!q.empty()){
pair<int,int> t=q.front();
q.pop();
r[t.first][t.second]=c;
for(int i=0;i<4;i++){
pair<int ,int> s;
s.first=t.first+dx[i];
s.second=t.second+dy[i];
if(s.first>=0&&s.first<n&&s.second>=0&&s.second<m
&&wall[s.first][s.second]==0&&been[s.first][s.second]==0)
{
been[s.first][s.second]=1;
q.push(s);
}
}
}
}
int main()
{
scanf("%d %d %d",&m,&n,&q);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
r[i][j]='.';
}
for(int i=0;i<q;i++){
int h;
scanf("%d",&h);
if(h==0)drawaline();
else fill();
}
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++)
printf("%c",r[i][j]);
printf("\n");
}
return 0;
}