题解
通过模拟的方法来暴力改变每个字符的值。
- 先进行初始化成为
.
。 - 碰到划线的地方先判断一下是横线还是竖线然后分情况讨论,如果在划线过程中碰到已经存在的线条要单独考虑。
- 填充用dfs进行,直到碰到边界或者碰到线。
- 最后按行逆序输出,列不变。
注意以下几个坑点:
x
和y
与数组中x,y
的方向有差别,需要手动调整定义方式。- 在划线的时候除了要把重合的线化成
+
,对于已经有+
的点不能再进行改变。 - 在进行dfs的时候,注意要判断边界问题,所有的
| + -
都不能改变。
题解
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100+10;
int m, n, q;
char ans[MAXN][MAXN];
void init() {
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
ans[i][j] = '.';
}
}
}
void paintline(int x1, int y1, int x2, int y2) {
if (y1 == y2) {
for(int i = min(x1,x2); i <= max(x1,x2); i++) {
if(ans[y1][i] == '|' || ans[y1][i] == '+') ans[y1][i] = '+';
else ans[y1][i] = '-';
}
} else if (x1 == x2) {
for(int j = min(y1,y2); j <= max(y1,y2); j++) {
if(ans[j][x1] == '-' || ans[j][x1] == '+') ans[j][x1] = '+';
else ans[j][x1] = '|';
}
}
}
const int dx[] = {0,1,-1,0};
const int dy[] = {1,0,0,-1};
bool vis[MAXN][MAXN];
void filling(int x, int y, char c) {
ans[y][x] = c;
vis[y][x] = 1;
for(int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && ny >= 0 && nx < m && ny < n
&& ans[ny][nx] != '-' && ans[ny][nx] != '|' && ans[ny][nx] != '+'
&& !vis[ny][nx]) {
filling(nx,ny,c);
}
}
}
void print() {
for(int i = n-1; i >= 0; --i) {
for(int j = 0; j < m; ++j) {
cout << ans[i][j];
}
cout << endl;
}
}
int main() {
cin >> m >> n >> q;
init();
while (q--) {
memset(vis, 0, sizeof(vis));
int t, x1, y1, x2, y2, x, y;
char c;
cin >> t;
if (t == 0) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
paintline(x1, y1, x2, y2);
} else if (t == 1) {
scanf("%d%d", &x, &y);
cin >> c;
// cout << "result:" << x << "," << y << "," << c << endl;
filling(x, y, c);
}
}
print();
return 0;
}
/*
16 13 1
0 12 3 6 3
4 2 2
1 0 0 B
0 1 0 2 0
................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................
*/