1.题意简介:要求利用ASCII码设计一个画图的程序,该程序要实现两个操作:
(1)画线:给出两个端点的坐标,画一条连接这两个端点的线段。
(2)填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。
注:在画线操作中,每条线都是水平或竖直的;在填充操作中,相邻位置只需要考虑上下左右 4 个方向。
输入格式:第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。第2行至第q + 1行,每行是以下两种形式之一:
(1)0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
(2)1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
要求输出:输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
数据范围:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)
2.做法思路:该题的做法和迷宫问题类似,主要算法为dfs遍历和input函数。不同点在于在纸张的规定地方进行字符的填充,需要判断其附近的输出情况。
程序开始时,利用makepaper函数将纸张初始化,此时表示填充字符的二维数组a全部值为零,在程序中,a[i][j]为0表示该位置为字符,在input函数中,分0和1两种操作,输入为0时,读入线段两端点的坐标,此时将对应的a数组的值变为1,表示该位置为线段;当输入为1时,读入要填充的字符和初始位置放在对应的char类型二维数组c中,此时调用dfs函数,记录该位置的周围的没有被画线的位置坐标。
输出:输出时利用了x和y两个变量,当上述input函数执行完毕后,a数组和c数组中记录了该图的全部信息,首先判断a数组对应位置的值,为0则输出c数组的对应字符,为1则进入输出线段的步骤,输出线段时,通过判断a[j][i+1]、a[j][i-1]、a[j+1][i]和a[j-1][i]这四个方位的值来判断线段的类型是‘-’还是‘+’还是‘|’,x变量控制该位置的上下方向,y变量控制该位置的左右方向,为1 表示有端点,为0表示没有端点。
3.代码:
#include<iostream> using namespace std; int a[110][110],b[110][110]; char c[110][110]; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int n,m; int o,x1,x2,y1,y2,x,y; char ch; void dfs(int x,int y) { for (int i=0;i<4;i++) { if (x+dx[i]>=0 && x+dx[i]<=n && y+dy[i]>=0 &&y+dy[i]<=m && b[x+dx[i]][y+dy[i]]==0) { c[x+dx[i]][y+dy[i]]=ch; b[x+dx[i]][y+dy[i]]=1; dfs(x+dx[i],y+dy[i]); } } return; } void makepaper() { for(int i=0;i<=105;i++) { for(int j=0;j<=105;j++) { a[i][j]=0; c[i][j]='.'; } } } void input(int q) { for (int l=0;l<q;l++) { cin>>o; if (o==1) { cin>>x>>y>>ch; x++;y++; for (int i=0;i<=n;i++) for (int j=0;j<=m;j++) b[i][j]=a[i][j]; dfs(x,y); } else if (o==0) { cin>>x1>>y1>>x2>>y2; x1++; x2++; y1++; y2++; if (x1>x2) { int t=x1; x1=x2; x2=t; } if (y1>y2) { int t=y1; y1=y2; y2=t; } if (x1==x2) for (int i=y1;i<=y2;i++) { a[x1][i]=1; b[x1][i]=1; } if (y1==y2) for (int i=x1;i<=x2;i++) { a[i][y1]=1; b[i][y1]=1; } } } } int main() { int q; makepaper(); cin>>n>>m>>q; n++; m++; input(q); for (int i=m-1;i>0;i--) { for (int j=1;j<n;j++) if (a[j][i]==0) cout<<c[j][i]; else { x=0; y=0; if (a[j][i+1]==1 || a[j][i-1]==1) x=1; if (a[j+1][i]==1 || a[j-1][i]==1) y=1; if (x==1 && y==1) cout<<"+"; else if (x==1) cout<<"|"; else cout<<"-"; } cout<<endl; } return 0; }