CSP 201512-3 画图

题意

思路

按输入初始化图

  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值