題解
通過模擬的方法來暴力改變每個字符的值。
- 先進行初始化成爲
.
。 - 碰到劃線的地方先判斷一下是橫線還是豎線然後分情況討論,如果在劃線過程中碰到已經存在的線條要單獨考慮。
- 填充用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|...
...+--------+...
................
*/