「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|...
...+--------+...
................

*/

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