首页 > 其他 > 详细

CCF CSP 201512-3 画图

时间:2020-06-26 10:24:34      阅读:65      评论:0      收藏:0      [点我收藏+]

技术分享图片

思路

  • 用数组模拟坐标系,值得注意的是:
    • 数组的行对应坐标系的x轴(0 ~ m);
    • 数组的列对应坐标系的y轴(n-1 ~ 0).
  • 输入每个操作类型的标志qflg
    1. 如果qflg == 1,则是填充。
    2. 如果qflg == 0,则是画线
  • 填充:递归扫描
    • 结束递归条件:1. 超出画布边缘; 2. 坐标位置上已有画好的线段; 3. 坐标位置上已有该字符
    • 填充该字符
    • 坐标的上下左右递归扫描填充
  • 画线:
    • 横向画线--(y1 == y2):从min(x1, x2)画到max(x1, x2)(因为没有规定x1<x2)
      • 如果该坐标已经画了竖向线"|"或者"+",就画上"+";(注意:判断"+")
      • 否则就画上横向线"-"
    • 竖向线同理。

CODE

#include<bits/stdc++.h>
#define N 105
#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;

char a[N][N];
int m, n;

//坐标系x对应数组的行,y对应数组的列 
void fill(int x, int y, char c){
	if(x<0 || x>=m || y<0 || y>=n) return;  //边界 
	if(a[y][x]==‘|‘ || a[y][x]==‘-‘ || a[y][x]==‘+‘ || a[y][x]==c) return;  //已有字符 
	a[y][x] = c;
	fill(x-1, y, c);  //左 
	fill(x+1, y, c);  //右 
	fill(x, y-1, c);  //下 
	fill(x, y+1, c);  //上 
}

void line(int x1, int y1, int x2, int y2){
	if(x1 == x2){  //竖向 | 
		for(int j = min(y1, y2); j<=max(y1, y2); j++){
			if(a[j][x1]==‘-‘ || a[j][x1]==‘+‘){  //已经有-或者已经是+ 
				a[j][x1] = ‘+‘;
			}
			else a[j][x1] = ‘|‘;
		} //for 
	} //if 
	else{  //横向-- 
		for(int j = min(x1,x2); j<=max(x1, x2); j++){
			if(a[y1][j] == ‘|‘ || a[y1][j] == ‘+‘){
				a[y1][j] = ‘+‘;
			}
			else a[y1][j] = ‘-‘;
		}  //for 
	}  //else
}  //void 

int main(){
	int ans;
	int qflg, x, y, x1, x2, y1, y2;
	char c;
	mst(a, ‘.‘);
	int q;
	cin >> m >> n>> q;
	for(int i=0; i<q; i++){
		cin >> qflg;
		if(qflg){  //1:填充 
			cin >> x >> y >> c;
			fill(x, y, c);
		}  
		else{  //0:画线 
			cin >> x1 >> y1 >> x2 >> y2;
			line(x1, y1, x2, y2);
		}
	} 
	// 输出 
	for(int i=n-1; i>=0; i--){  //数组的列0~n是从上到下,坐标y的0~n是从下到上 
		for(int j=0; j<m; j++){
			cout<<a[i][j];
		}
		cout<<endl;
	}
	return 0;
}

CCF CSP 201512-3 画图

原文:https://www.cnblogs.com/monster-yher/p/13193623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!