![]()
思路
- 用数组模拟坐标系,值得注意的是:
- 数组的行对应坐标系的x轴(0 ~ m);
- 数组的列对应坐标系的y轴(n-1 ~ 0).
- 输入每个操作类型的标志qflg
- 如果qflg == 1,则是填充。
- 如果qflg == 0,则是画线
- 填充:递归扫描
- 结束递归条件:1. 超出画布边缘; 2. 坐标位置上已有画好的线段; 3. 坐标位置上已有该字符
- 填充该字符
- 坐标的上下左右递归扫描填充
- 画线:
- 横向画线--(y1 == y2):从min(x1, x2)画到max(x1, x2)(因为没有规定x1<x2)
- 如果该坐标已经画了竖向线"|"或者"+",就画上"+";(注意:判断"+")
- 否则就画上横向线"-"
- 竖向线同理。
CODE
#include<bits/stdc++.h>
#define N 105
#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
char a[N][N];
int m, n;
//坐标系x对应数组的行,y对应数组的列
void fill(int x, int y, char c){
if(x<0 || x>=m || y<0 || y>=n) return; //边界
if(a[y][x]=='|' || a[y][x]=='-' || a[y][x]=='+' || a[y][x]==c) return; //已有字符
a[y][x] = c;
fill(x-1, y, c); //左
fill(x+1, y, c); //右
fill(x, y-1, c); //下
fill(x, y+1, c); //上
}
void line(int x1, int y1, int x2, int y2){
if(x1 == x2){ //竖向 |
for(int j = min(y1, y2); j<=max(y1, y2); j++){
if(a[j][x1]=='-' || a[j][x1]=='+'){ //已经有-或者已经是+
a[j][x1] = '+';
}
else a[j][x1] = '|';
} //for
} //if
else{ //横向--
for(int j = min(x1,x2); j<=max(x1, x2); j++){
if(a[y1][j] == '|' || a[y1][j] == '+'){
a[y1][j] = '+';
}
else a[y1][j] = '-';
} //for
} //else
} //void
int main(){
int ans;
int qflg, x, y, x1, x2, y1, y2;
char c;
mst(a, '.');
int q;
cin >> m >> n>> q;
for(int i=0; i<q; i++){
cin >> qflg;
if(qflg){ //1:填充
cin >> x >> y >> c;
fill(x, y, c);
}
else{ //0:画线
cin >> x1 >> y1 >> x2 >> y2;
line(x1, y1, x2, y2);
}
}
// 输出
for(int i=n-1; i>=0; i--){ //数组的列0~n是从上到下,坐标y的0~n是从下到上
for(int j=0; j<m; j++){
cout<<a[i][j];
}
cout<<endl;
}
return 0;
}