CSP:201512-3 画图(C++)

题目

原题传送门
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目思路

1、形成画布,根据输入长宽初始化画布,将全部像素都初始化为 '.' 
2、输入操作,根据输入的q个操作依次对画布进行修改
	w = 0 :画线段操作,根据输入的x1,y1,x2,y2进行画'|'和'-',通过当前点的状态判断是否更改为'+'
		·y1 == y2  横线
		·x1 == x2  竖线
	w = 1:填充操作,根据输入的x,y,c利用递归方法进行填充
3、画图完成后,按顺序输出画布上的画。

此题需要注意坐标系的表示,明确x轴与y轴;
另外,对于画线段操作何时画'+'的操作判断需要注意,画竖线时只需要判断当前点的状态是否是'+'或’-‘,若是则画'+',对于重复画竖线的地方最后结果应仍然是竖线。

代码实现

#include<bits/stdc++.h>
using namespace std;
int m,n,q,w;
char a[105][105];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
void dfs(int x,int y,char c)
{
 	a[y][x]=c;
 	for(int i=0;i<4;i++)
 	{
  		int xx=x+dx[i];
  		int yy=y+dy[i];
  		if(a[yy][xx]!='|' && a[yy][xx]!='-' && a[yy][xx]!='+' && a[yy][xx]!=c &&(xx<m&&xx>=0) && (yy>=0&&yy<n))
   			dfs(xx,yy,c);
 	}
 	return;
}
int main()
{
 	scanf("%d %d %d",&m,&n,&q);
 	for(int i=0;i<n;i++)
  		for(int j=0;j<m;j++)
   			a[i][j]='.';
 	for(int i=0;i<q;i++)
 	{
  		scanf("%d",&w);
  		if(w==0)
  		{
   			int x1,y1,x2,y2;
   			scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
   			if(x1==x2)
   			{
    				for(int z=min(y1,y2);z<=max(y1,y2);z++)
    				{
     					if(a[z][x1]=='-' || a[z][x1]=='+')
      						a[z][x1]='+';
     					else 
      						a[z][x1]='|';
    				} 
   			 }
   			else if(y1==y2)
   			{
    					for(int z=min(x1,x2);z<=max(x1,x2);z++)
    					{
     						if(a[y1][z]=='|' || a[y1][z]=='+')
      							a[y1][z]='+';
     						else 
      							a[y1][z]='-';
    					}
   			}
  		}
  		if(w==1)
  		{
   			int x,y;
   			char c;
   			scanf("%d %d %c",&x,&y,&c);
   			dfs(x,y,c); 
  		}
 	} 
 
 	for(int y=n-1;y>=0;y--)
 	{
  		for(int x=0;x<m;x++)
  		{
   			printf("%c",a[y][x]);
  		}
  		printf("\n");
 	}
 	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值