CCF认证 2015-12 画图
2018-02-20 16:02
309 查看
有两种操作,划线和填充,填充用dfs写就可以,划线分横线和竖线,注意细节和坐标变换
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=100+10; const int M=100+10; const int dx[]={0,0,-1,1}; const int dy[]={-1,1,0,0}; char a [M]; int n,m,q; void dfs(int x,int y,char c) //填充操作 { a[x][y]=c; for(int i=0;i<4;i++) { int nx=x+dx[i],ny=y+dy[i]; if(nx>=m||nx<0||ny>=n||ny<0) continue; //越界 if(a[nx][ny]=='+'||a[nx][ny]=='|'||a[nx][ny]=='-'||a[nx][ny]==c) continue; //碰到线段或者已经填充过 dfs(nx,ny,c); } } int main() { int k,x1,y1,x2,y2; char c; scanf("%d%d%d",&n,&m,&q); memset(a,'.',sizeof(a)); while(q--) { scanf("%d",&k); if(k) //填充 { scanf("%d%d",&y1,&x1); getchar(); c=getchar(); dfs(x1,y1,c); } else { scanf("%d%d%d%d",&y1,&x1,&y2,&x2); if(x1==x2) //画横线 { if(y2<y1) { int t=y1; y1=y2; y2=t; } for(int i=y1;i<=y2;i++) if(a[x1][i]=='|'||a[x1][i]=='+') a[x1][i]='+'; //遇到交叉画十字 else a[x1][i]='-'; } if(y1==y2) //画竖线 { if(x2<x1) { int t=x1; x1=x2; x2=t; } for(int i=x1;i<=x2;i++) if(a[i][y1]=='-'||a[i][y1]=='+') a[i][y1]='+'; //遇到交叉画十字 else a[i][y1]='|'; } } } for(int i=m-1;i>=0;i--) //输出 { for(int j=0;j<n-1;j++) printf("%c",a[i][j]); printf("%c\n",a[i][n-1]); } return 0; }
相关文章推荐
- CCF认证 2015-12 消除类游戏
- CCF认证 2015-12 送货
- CCF认证 2015-12 数位之和
- 随记_2015_05_12
- CCF认证 2014-12 门禁系统
- work of weekend 12/12/2015~12/14/2015
- stand up meeting 12/18/2015 ~12/20/2015(weekend)
- stand up meeting 12/25/2015 & weekend 12/26/2015~12/27/2015
- 杭电ACM计算机学院大学生程序设计竞赛(2015’12)1004(最大生成树)
- 计算机学院大学生程序设计竞赛(2015’12)The Country List
- 计算机学院大学生程序设计竞赛(2015’12)Bitwise Equations
- Skype for Business Server 2015-12-WAP-发布-2-邮件服务器
- En(2015-12)小耳机深情陪伴
- 2015‘12杭电校赛1006 01 Matrix(二维DP)
- 2015ACM/ICPC亚洲区上海站【solved:4 / 12】
- 【起航计划 013】2015 起航计划 Android APIDemo的魔鬼步伐 12 App->Activity->SetWallpaper 设置壁纸 WallpaperManager getDrawingCache使用
- 2015 12 3 Handler
- C++(12):vs2015使用log4cplus
- 每天学点新东西 2015 10 12
- stand up meeting 12/2/2015