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;
}