CCF-CSP 2015-12-3画图

大佬解法:https://blog.csdn.net/richenyunqi/article/details/87871209

看了大佬的解法,有所感想并且想做一些解读。

算法设计:

首先定义一个nxm的二维数组graph来存储整个图形。把题目中的坐标转换成graph中的坐标,对于题目中的坐标(x,y),在graph中的坐标应该为(n-1-y,x)。这个画个图就比较好理解。

然后就是画图,画线段就很容易,填充图形要求该字符以及填充该字符的相邻位置,可以用DFS(深度优先遍历实)现,当坐标超过画布或者坐标是线段的一部分或者此位置已经填充过,即结束当前搜索,否则就填充,并对相邻四个坐标同样进行DFS。

注意点:

要考虑到x1>x2或者y1>y2的情况。

C++代码

#include<bits/stdc++.h>
using namespace std;

char graph[105][105]; //整个图
int m,n,q,command,direct[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; //四个方向,左右上下
void DFS(int i,int j,char c){//填充字符 
	if(i<0||i<=n||j<0||j>=m
	||graph[i][j]=='-'||graph[i][j]=='|'||graph[i][j]=='+' //是线段的一部分 
	||graph[i][j]==c){ //已经填充过 
		return; 
	}
	graph[i][j] = c;//进行填充
	for(int k =0;k<4;++k){ //递归处理4个周边坐标 
		DFS(i+direct[k][0],j+direct[k][1],c);
	} 
} 

int main(){
	scanf("%d%d%d",&m,&n,&q);
	memest(graph,'.',sizeof(graph)); //对字符数组进行填充
	while(q--){
		scanf("%d",&command); 
		if(command==0){ //画线 
 			int y1,y2,x1,x2;
 			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
 			if(x1>x2){ //x1存储x1和x2之间的最小值,x2存储 x1和x2之间的最大值
 				swap(x1,x2); 
			 }
			 if(y1<y2){ //y1存储y1和y2之间的最小值,y2存储y1和y2之间的最大值
			 	swap(y1,y2);
			 } 
			 if(x1!=x2){ //y1=y2
			 	for(int i = x1;i<=x2;++i){
			 		if(graph[n-1-y1][i]=='|'||graph[n-1-i][x1]=='+'){
			 			graph[n-1-y1][i] = '+';
					 }else{
					 	graph[n-1-y1][i] = '-';

					 }
				 }
			 }else{ //x1=x2
			 	for(int i = y1;i>=y2;--i){
			 		if(graph[n-1-i][x1]=='-'||graph[n-1-i][x1]=='+'){
			 			graph[n-1-i][x1]=='+';
					 }else{
					 	graph[n-1-i][x1]=='|';
					 }
				 }
			 }
		}else{
			int x,y;
			char c;
			scanf("%d%d %c",&x,&y,&c);
			DFS(n-1-y,x,c);
		}
	} 
	
	for(int i = 0;j<n;++i){
		for(int j = 0;j<m;++j){
			printf("%c",graph[i][j]);
		}
		puts("");
	}
	return 0;
	
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值