201512-3-画图

题目

在这里插入图片描述
思路
本体比较简单主要就两个操作:画线和填充;画线比较简单,用for循环和if判断即可;填充操作用的是dfs填充的方法,如果不碰到边界和线段就填充,并且记录vis数组为已经访问。反而我觉得最绕的是输出,想象二维数组的(0,0)在左上角,坐标系的在左下角。

代码

#include <iostream>
#include<string.h>
#define MAX 105
using namespace std;
int m,n,q;
int x1,x2,y1,y2;
char map[MAX][MAX];
bool vis[MAX][MAX];   
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
void line()  //画线 
{
 if(x1==x2)  
 {
  if(y2>y1)  
  swap(y1,y2);
    for(int i=y2;i<=y1;i++)
   {
    if(map[x1][i]!='-'&&map[x1][i]!='+')  
    map[x1][i] = '|';
    else
    map[x1][i]='+';
   }
 }
 else if(y1==y2)  
 {
  if(x2>x1) 
  swap(x1,x2);
  for(int i=x2;i<=x1;i++)
   {
    if(map[i][y1]!='|'&&map[i][y1]!='+')  
    map[i][y1] = '-';
    else
    map[i][y1]='+';
   }
 }
}
void fill(int x,int y,char c)   //填充 
{
 if(x<0||x>=m||y<0||y>=n)
 return;
 if(map[x][y]== '-'||map[x][y]== '|'||map[x][y]== '+'||vis[x][y])
 return;
 map[x][y]=c;
 vis[x][y]=true;
 for(int i=0;i<4;i++)
 {
  fill(x+dx[i],y+dy[i],c);
 }
} 
int main()
{
 cin>>m>>n>>q;
 memset(map,'.',sizeof(map));
 for(int i=0;i<q;i++)
 {
  int op;
  cin>>op;
  if(op==1)
  {
   int x,y;
   char c;
   cin>>x>>y>>c;
   memset(vis,false,sizeof(vis)); 
   fill(x,y,c);
  }
  else if(op==0)
  { 
   cin>>x1>>y1>>x2>>y2;
   line();
  }
 } 
 for(int i = n-1; i >= 0; i--)
 {
  for(int j=0;j<m;j++)
  {
   cout<<map[j][i];//注意输出的方式,想象二维数组的(0,0)在左上角,坐标系的在左下角 
  }
  cout<<endl;
 }
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值