「CSP」 201512-3 画图 模拟

传送门

题解

通过模拟的方法来暴力改变每个字符的值。

  • 先进行初始化成为.
  • 碰到划线的地方先判断一下是横线还是竖线然后分情况讨论,如果在划线过程中碰到已经存在的线条要单独考虑。
  • 填充用dfs进行,直到碰到边界或者碰到线。
  • 最后按行逆序输出,列不变。

注意以下几个坑点:

  1. xy与数组中x,y的方向有差别,需要手动调整定义方式。
  2. 在划线的时候除了要把重合的线化成+,对于已经有+的点不能再进行改变。
  3. 在进行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|...
...+--------+...
................

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章