第一次月模拟题

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

猜你喜欢

转载自www.cnblogs.com/muxin2333/p/12719389.html
今日推荐