我的作业之旅之程序设计思维第一个月模拟题

201512-3 画图

题干
在这里插入图片描述思路
这个题不难,主要就是实现三个功能填充、画线和输出。
为什么要把输出也划分成一个功能呢?因为他这个坐标系的(x,y)和数组的【x,y】有点差异,我的做法就是,先把数组索引按照坐标系坐标操作,最后输出的时候将索引转化一下就可以了。
然后是填充,我用的深搜,每个点看四个方向,当移动一步之后没有出界,并且改点不是‘|’‘-’‘+’或者被标记过,就填充并且继续搜索。
画线要考虑的情况就比较多了,首先判断要画的是‘|’还是‘-’,然后在遇到不同的笔画时,要将该处改成‘+’,当遇到相同笔画时,还要继续走,直到到达目的地。
代码

#include<iostream>
using namespace std;
int m,n,op;//宽高和操作数
char picture[100][100];//每个像素的数组
//int ope;//每一步的操作数组,采用边输入边处理的方法
//int move1[4]={0,1,0,-1};
//int move2[4]={1,0,-1,0};
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void chushi()
{
	for(int i=0;i<100;i++)
	for(int j=0;j<100;j++)
	   picture[i][j]='.';
 } 
 void fill(int x,int y,char c)
 {
 	picture[x][y]=c;
 	int a[2]={x,y};
 	int b[2];
 	for(int i=0;i<4;i++)
 	{
 		b[0]=a[0]+move[i][0];
 		b[1]=a[1]+move[i][1];
 		//cout<<b[0]<<" "<<b[1]<<endl;
 		if(b[0]>=0&&b[0]<m&&b[1]>=0&&b[1]<n)
 		{
 			//cout<<1<<endl;
 			if(picture[b[0]][b[1]]!='|'&&picture[b[0]][b[1]]!='-'&&picture[b[0]][b[1]]!=c&&picture[b[0]][b[1]]!='+')
 			{
 				//picture[b[0]][b[1]]=c;
 				fill(b[0],b[1],c);
			 }
			 //else
			 //{
			 	//b[0]=a[0];
			 	//b[1]=a[1];
			 	//return;
			 //}
			 
		 }
		 //else
		 //{
		 	//b[0]=a[0];
			//b[1]=a[1];
			//return;
		 //}
		 
	 }
	 return;
 	
 }
 void draw_line(int x,int y,int a,int b)
 {
 	char c;
 	int q,r,s,t;
 	if(y==b)
 	{
 		c='-';
 		if(x<=a)
 		{
 			q=x;s=y;
 			r=a;t=b;
		 }
		 else
		 {
		 	q=a;s=b;
 			r=x;t=y;
		 }
 		while(q<=r)
 		{
 			if(picture[q][s]=='|')
 			{
 				picture[q][s]='+';
 				q++;
 				continue;
			 }
			 else if(picture[q][s]=='+')
			 {
			 	q++;
			 	continue;
			 }
			 picture[q][s]='-';
			 q++;
	 	}
	 }
 	else 
 	{
 		c='|';
 		if(y<=b)
 		{
 			q=x;s=y;
 			r=a;t=b;
		 }
		 else
		 {
		 	q=a;s=b;
 			r=x;t=y;
		 }
 		while(s<=t)
 		{
 			if(picture[q][s]=='-')
 			{
 				picture[q][s]='+';
 				s++;
 				continue;
			 }
			 else if(picture[q][s]=='+')
			 {
			 	s++;
			 	continue;
			 }
			 picture[q][s]='|';
			 s++;
	 	}
	 }	
 }
 int main()
 {
 	scanf("%d%d%d",&m,&n,&op);
 	chushi();
 	for(int i=0;i<op;i++)
 	{
 		int ope;
 		scanf("%d",&ope);
 		if(ope==1)
 		{
 			int x,y;
 			char c;
 			scanf("%d%d",&x,&y);
 			cin>>c;
 			fill(x,y,c);
		 }
		 else
		 {
		 	int x,y,a,b;
		 	scanf("%d%d%d%d",&x,&y,&a,&b);
		 	draw_line(x,y,a,b);
		 }
	 }
	 //fill(0,0,'B');
	 //draw_line(1,0,2,0);
	//fill(0,0,'A');
 	for(int j=n-1;j>=0;j--)
 	{
 		for(int i=0;i<m;i++)
	   cout<<picture[i][j];
	   cout<<endl;
	 }	
 	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值