zoukankan      html  css  js  c++  java
  • CCF201512-3 画图(100分)

    试题编号: 201512-3
    试题名称: 画图
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。
      ..____.____..____..____...___..
      ./.___/.___||.._.|.._../._..
      |.|...\___.|.|_).|.|_).|.|.|.|
      |.|___.___).|..__/|.._.<|.|_|.|
      .\____|____/|_|...|_|.\_\___/.
      本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
       画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
       填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
      .*.
      *@*
      .*.
    输入格式
      第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
      第2行至第q + 1行,每行是以下两种形式之一:
       0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2
       1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
      画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
    输出格式
      输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
    样例输入
    4 2 3
    1 0 0 B
    0 1 0 2 0
    1 0 0 A
    样例输出
    AAAA
    A--A
    样例输入
    16 13 9
    0 3 1 12 1
    0 12 1 12 3
    0 12 3 6 3
    0 6 3 6 9
    0 6 9 12 9
    0 12 9 12 11
    0 12 11 3 11
    0 3 11 3 1
    1 4 2 C
    样例输出
    ................
    ...+--------+...
    ...|CCCCCCCC|...
    ...|CC+-----+...
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC+-----+...
    ...|CCCCCCCC|...
    ...+--------+...
    ................
    评测用例规模与约定
      所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。

    问题链接:CCF201512试题

    问题描述(参见上文)。

    问题分析:这是一个模拟题,看懂题意就不难了。

    程序说明:坐标的转换需要注意。递归填充时,需要仔细考虑有关条件。

    提交后得100分的C++语言程序如下:

    /* CCF201512-3 画图 */
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    const int DIRECTSIZE = 4;
    struct direct {
        int dx, dy;
    } direct[DIRECTSIZE] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    
    const int N = 100;
    
    char grid[N+1][N+1];
    
    // 递归填充:被填充的点的四周也要填充
    void fill(int x, int y, char c, int m, int n)
    {
        int nx, ny;
    
        grid[y][x] = c;
    
        for(int i=0; i<DIRECTSIZE; i++) {
            ny = y + direct[i].dy;
            nx = x + direct[i].dx;
    
            if(0 <= nx && nx < m && 0 <= ny && ny < n &&
                    grid[ny][nx] != '|' && grid[ny][nx] != '-' && grid[ny][nx] != '+' &&
                    grid[ny][nx] != c)
                fill(nx, ny, c, m, n);
        }
    }
    
    int main()
    {
        int m, n, q, option;
        int x1, y1, x2, y2;
        char c;
        int start, end;
    
        // 变量初始化:全部设置为“.”
        memset(grid, '.', sizeof(grid));
    
        // 输入数据
        cin >> m >> n >> q;
    
        // 处理q个画图操作
        for(int i=1; i<=q; i++) {
            // 输入形式
            cin >> option;
    
            if(option == 0) {
                // 输入坐标
                cin >> x1 >> y1 >> x2 >> y2;
    
                // 画线
                if(x1 == x2) {
                    start = min(y1, y2);
                    end = max(y1, y2);
                    for(int j=start; j<=end; j++)
                        if(grid[j][x1] == '-' || grid[j][x1] == '+')
                            grid[j][x1] = '+';
                        else
                            grid[j][x1] = '|';
                } else if(y1 == y2) {
                    start = min(x1, x2);
                    end = max(x1, x2);
                    for(int j=start; j<=end; j++)
                        if(grid[y1][j] == '|' || grid[y1][j] == '+')
                            grid[y1][j] = '+';
                        else
                            grid[y1][j] = '-';
                }
            } else if(option == 1) {
                // 输入填充的坐标和字符
                cin >> x1 >> y1 >> c;
    
                // 递归填充
                fill(x1, y1, c, m, n);
            }
        }
    
        // 输出结果
        for(int i=n-1; i>=0; i--) {
            for(int j=0; j<m; j++)
                cout << grid[i][j];
            cout << endl;
        }
    
        return 0;
    }


  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564151.html
Copyright © 2011-2022 走看看