M. 画图

知识点:模拟

看起来很吓人,实际就是个模拟。

实现的时候最好想一下,如何避免过多的分类讨论。

提供一种较为优雅的绘制线段写法,绘制矩形的操作可以复用这个函数,调用4次即可。

void draw_line(int x1, int y1, int x2, int y2) {
    int len = max(abs(x1 - x2), abs(y1 - y2));
    int dx = (x2 - x1) / len, dy = (y2 - y1) / len;
    for (int i = 0; i <= len; ++i) {
        a[x1 + dx * i][y1 + dy * i] = 'x';
    }
}

标程

C++

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 1000 + 9;

int n, m;
char a[N][N];

void draw_line(int x1, int y1, int x2, int y2)
{
    int len = max(abs(x1 - x2), abs(y1 - y2));
    int dx = (x2 - x1) / len, dy = (y2 - y1) / len;
    for (int i = 0; i <= len; ++i)
    {
        a[x1 + dx * i][y1 + dy * i] = 'x';
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        fill(a[i] + 1, a[i] + m + 1, '.');
    }
    int k;
    cin >> k;
    while (k--)
    {
        int type, x1, y1, x2, y2;
        cin >> type >> x1 >> y1 >> x2 >> y2;
        if (type == 1) // 绘制线段
        {
            draw_line(x1, y1, x2, y2);
        }
        else // 绘制矩形
        {
            draw_line(x1, y1, x2, y1);
            draw_line(x2, y1, x2, y2);
            draw_line(x2, y2, x1, y2);
            draw_line(x1, y2, x1, y1);
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            cout << a[i][j];
        }
        cout << '\n';
    }
}

Java

import java.util.*;
import java.io.*;

public class Main {
    static Kattio io = new Kattio();

    static int n, m;
    static char[][] a;

    static void draw_line(int x1, int y1, int x2, int y2) {
        int len = Math.max(Math.abs(x2 - x1), Math.abs(y2 - y1));
        int dx = (x2 - x1) / len;
        int dy = (y2 - y1) / len;
        for (int i = 0; i <= len; i++) {
            a[x1 + i * dx][y1 + i * dy] = 'x';
        }
    }

    public static void main(String[] args) {
        n = io.nextInt();
        m = io.nextInt();
        a = new char[n + 2][m + 2];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                a[i][j] = '.';
            }
        }
        int k = io.nextInt();
        for (int i = 0; i < k; i++) {
            int type = io.nextInt();
            int x1 = io.nextInt();
            int y1 = io.nextInt();
            int x2 = io.nextInt();
            int y2 = io.nextInt();
            if (type == 1) { // line
                draw_line(x1, y1, x2, y2);
            } else { // rectangle
                draw_line(x1, y1, x2, y1);
                draw_line(x2, y1, x2, y2);
                draw_line(x2, y2, x1, y2);
                draw_line(x1, y2, x1, y1);
            }
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                io.print(a[i][j]);
            }
            io.println();
        }

        io.close();
    }
}

class Kattio extends PrintWriter {
    private BufferedReader r;
    private StringTokenizer st;
    // 标准 IO
    public Kattio() { this(System.in, System.out); }
    public Kattio(InputStream i, OutputStream o) {
        super(o);
        r = new BufferedReader(new InputStreamReader(i));
    }
    // 在没有其他输入时返回 null
    public String next() {
        try {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(r.readLine());
            return st.nextToken();
        } catch (Exception e) {}
        return null;
    }
    public int nextInt() { return Integer.parseInt(next()); }
    public double nextDouble() { return Double.parseDouble(next()); }
    public long nextLong() { return Long.parseLong(next()); }
}

Python

n, m = map(int, input().split())
a = [["." for j in range(m)] for i in range(n)]


def draw_line(x1, y1, x2, y2):
    length = max(abs(x2 - x1), abs(y2 - y1))
    dx = (x2 - x1) // length
    dy = (y2 - y1) // length
    for i in range(length + 1):
        a[x1 + i * dx][y1 + i * dy] = "x"


k = int(input())
for _ in range(k):
    tp, x1, y1, x2, y2 = map(int, input().split())
    x1 -= 1
    y1 -= 1
    x2 -= 1
    y2 -= 1
    if tp == 1:  # draw line
        draw_line(x1, y1, x2, y2)
    else:  # draw rectangle
        draw_line(x1, y1, x2, y1)
        draw_line(x2, y1, x2, y2)
        draw_line(x2, y2, x1, y2)
        draw_line(x1, y2, x1, y1)

for i in range(n):
    print("".join(a[i]))