题意
思路
按输入初始化图
- x相等且那个位置为 . 就填 - ;为 | 填 +
- y相等且那个位置为 . 就填 | ;为 - 填 +
- 这里记得判断位置为 + 号的情况,容易漏判。
然后BFS进行填充就行了。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<queue>
#define llong long long
#define For(i,a,n) for(register int i=a;i<=n;i++)
#define RF(i,a,n) for(register int i=a;i>=n;i--)
#pragma GCC optimize(2)
using namespace std;
const int maxn = 100005;
inline void in(int &x){
int y=1; char c=getchar(); x=0;
while(c<'0'||c>'9'){
if(c=='-') y=-1;
c=getchar();
}
while(c<='9'&&c>='0') x=(x<<1)+(x<<3)+c-'0',c=getchar();
x*=y;
}
void o(int x){
if(x<0) {putchar('-'); x=-x;}
if(x>9) o(x/10);
putchar(x%10+'0');
}
struct point{
int x, y;
point():x(0),y(0){}
point(int a, int b):x(a),y(b){}
};
int m, n, q;
char G[105][105];
int vis[105][105];
int mx[] = {-1,0,1,0};
int my[] = {0,1,0,-1};
queue<point> Q;
int val(int x, int y)
{
if(x<0 || x>=n || y<0 || y>=m)
return 0;
if(G[x][y] == '-' || G[x][y] == '|' || G[x][y] == '+')
return 0;
if(vis[x][y])
return 0;
return 1;
}
void bfs(int x, int y, char ch)
{
memset(vis, 0, sizeof(vis));
if(val(x,y)){
G[x][y] = ch;
vis[x][y] = 1;
Q.push(point(x,y));
while(Q.size()){
point t = Q.front(); Q.pop();
x = t.x, y = t.y;
For(i,0,3){
int tx=x+mx[i], ty=y+my[i];
if(val(tx,ty)){
G[tx][ty] = ch;
vis[tx][ty] = 1;
Q.push(point(tx,ty));
}
}
}
}
}
int main(){
in(m), in(n), in(q);
For(i,0,n-1)
For(j,0,m-1)
G[i][j] = '.';
For(i,1,q){
int opr;
in(opr);
if(!opr){
int x1, x2, y1, y2;
in(x1), in(y1), in(x2), in(y2);
int t1=x1, t2 = x2;
x1=n-1-y1, y1=t1, x2=n-1-y2, y2=t2;
if(x1==x2){
if(y1>y2) swap(y1,y2);
For(y,y1,y2){
if(G[x1][y]=='|'||G[x1][y]=='+') G[x1][y] = '+';
else G[x1][y] = '-';
}
}
if(y1==y2){
if(x1>x2) swap(x1,x2);
For(x,x1,x2){
if(G[x][y1]=='-' || G[x][y1]=='+') G[x][y1] = '+';
else G[x][y1] = '|';
}
}
}
else{
int x, y;
char ch;
in(x), in(y), ch = getchar();
int t=x;
x=n-1-y, y=t;
bfs(x, y, ch);
}
}
For(i,0,n-1){
For(j,0,m-1){
cout<<G[i][j];
}
cout<<endl;
}
return 0;
}