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]))