DFS
- 看着y总的写法有点复杂。
- 自己尝试着写了一下。本题的坑在于起点在左下角,不在左上角。其实,我们完全可以将每个点的坐标(x,y)倒过来读,变成(y,x),这样就变成了我们习惯的行与列,最后输出的时候每行从下往上输出即可。
- 这里的坐标倒过来是什么意思呢?以样例为例
0 1 0 2 0
,(1,0) 和(2,0),倒着读就是(0, 1)和(0,2),对应的是第一行的第二列,和第一行的第三列。这样是不是就顺畅多了?
具体分析请参考笔者的题解:
https://lishizheng.blog.csdn.net/article/details/115347238
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m ,q;
char g[N][N];
bool st[N][N];
void change(int x1, int y1, int x2, int y2){
if(x1 == x2){// 同一行
for(int i = y1; i <= y2; i ++){
if( g[x1][i] == '|'|| g[x1][i] == '+') g[x1][i]= '+';
else g[x1][i] = '-';
}
}
// 同一列
else if ( y1 == y2){
for(int i = x1; i <= x2; i ++){
if( g[i][y1] == '-' || g[i][y1] == '+') g[i][y1] = '+';
else g[i][y1] = '|';
}
}
}
void paint(int x, int y, char s){
st[x][y] = true;
g[x][y] = s;
int dx[4] = { -1, 0, 1, 0}, dy[4] = { 0, 1, 0, -1};
for(int i = 0; i < 4; i ++){
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]) continue;
if(g[a][b] == '|' || g[a][b] == '-' || g[a][b] == '+') continue;
paint(a, b, s);
}
}
int main(){
cin >> m >> n >> q;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
g[i][j] = '.';
while(q --){
int op;
cin >> op;
if(op == 0){
// x和y反着读入
int x1, y1, x2, y2;
cin >> y1 >> x1 >> y2 >> x2;
if(x1 > x2) swap(x1, x2);
if(y1 > y2) swap(y1, y2);
change(x1, y1, x2, y2);
}
else{
int x, y;
char s;
// x和y反着读入
cin >> y >> x >> s;
memset(st, 0, sizeof st);
paint(x, y, s);
}
}
for(int i = n -1; i >= 0; i--){
for(int j = 0; j < m; j++)
cout << g[i][j];
cout << endl;
}
}
👍