棋盘
棋盘
题目描述
小蓝拥有 n × n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反 (也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。
输入格式
输入的第一行包含两个整数 n, m,用一个空格分隔,表示棋盘大小与操作数。接下来 m 行每行包含四个整数 x1, y1, x2, y2,相邻整数之间使用一个空格分隔,表示将在 x1 至 x2 行和 y1 至 y2 列中的棋子颜色取反。
输出格式
输出 n 行,每行 n 个 0 或 1 表示该位置棋子的颜色。如果是白色则输出 0,否则输出 1 。
样例输入
3 3
1 1 2 2
2 2 3 3
1 1 3 3
样例输出
001
010
100
解题思路
采用io流加快输出。
在Java中,IO流(尤其是缓冲流)的输入/输出速度通常比Scanner更快,尤其是在处理大规模数据时。以下是具体分析:
1. Scanner的特点
- 用途:
Scanner主要用于解析输入(如文本、文件、用户输入),支持自动类型转换(如nextInt()、nextDouble())。 - 性能开销:
- 底层基于正则表达式分割输入,处理分词(tokenization)需要额外时间。
- 逐行或逐词解析时,可能频繁触发底层IO操作(如文件读取),效率较低。
- 优点:开发便捷,适合处理结构化输入(如混合类型的数据)。
2. IO流的特点
- 缓冲流(BufferedReader/BufferedWriter):
- 通过缓冲区减少物理IO操作次数(如磁盘读写),显著提升效率。
- 直接操作字符或字节,无额外解析开销。
- 适用场景:
- 需要高性能的大文件读写。
- 无需复杂解析的纯文本或二进制数据处理。
3. 性能对比
-
读取文件示例:
java
复制
// 使用BufferedReader读取文件 try (BufferedReader br = new BufferedReader(new FileReader("large_file.txt"))) { String line; while ((line = br.readLine()) != null) { // 处理行数据 } } // 使用Scanner读取同一文件 try (Scanner scanner = new Scanner(new File("large_file.txt"))) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); // 处理行数据 } }- 结果:
BufferedReader的读取速度通常比Scanner快2-10倍,具体取决于文件大小和硬件。
- 结果:
4. 关键差异总结
| 特性 | Scanner | IO流(缓冲流) |
|---|---|---|
| 设计目的 | 解析结构化输入(如用户输入、文件) | 高效处理原始字节/字符数据 |
| 性能 | 较慢(因解析开销) | 更快(减少IO次数,无解析开销) |
| 内存占用 | 较高(维护分词状态) | 较低 |
| 适用场景 | 小规模数据或需要类型解析的场景 | 大规模数据或高性能需求 |
5.PrintWriter
java.io包的PrintWriter类可用于以通常可读的形式(文本)写入输出数据。与其他写入器不同,PrintWriter将原始数据(int、float、char等)转换为文本格式。然后它将格式化的数据写入到写入器。另外,PrintWriter类不会抛出任何输入/输出异常。相反,我们需要使用checkError()方法来查找其中的任何错误。
PrintWriter类还具有自动冲洗功能。这意味着,如果调用println()或printf()方法之一,它将强制写入器将所有数据写入目标。
代码
import java.util.Scanner;
import java.io.*;
public class Main {
static PrintWriter out=new PrintWriter(System.out);
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//棋盘大小
int n = scanner.nextInt();
int m = scanner.nextInt();
//绘制棋盘
boolean[][] matrix=new boolean[n+1][n+1];
int[] x1=new int[m];
int[] x2=new int[m];
int[] y1=new int[m];
int[] y2=new int[m];
for(int i=0;i<m;i++){
x1[i]=scanner.nextInt();
y1[i]=scanner.nextInt();
x2[i]=scanner.nextInt();
y2[i]=scanner.nextInt();
}
int x_min=Integer.MAX_VALUE,y_min=Integer.MAX_VALUE,x_max=Integer.MIN_VALUE,y_max=Integer.MIN_VALUE;
for(int i=0;i<m;i++){
if(x1[i]<x_min)x_min=x1[i];
if(x2[i]<x_min)x_min=x2[i];
if(y1[i]<y_min)y_min=y1[i];
if(y2[i]<y_min)y_min=y2[i];
if(x1[i]>x_max)x_max=x1[i];
if(x2[i]>x_max)x_max=x2[i];
if(y1[i]>y_max)y_max=y1[i];
if(y2[i]>y_max)y_max=y2[i];
}
for(int i=0;i<m;i++){
for(int j=x1[i];j<=x2[i];j++){
for (int k=y1[i];k<=y2[i];k++){
matrix[j][k]=!matrix[j][k];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(matrix[i][j]) out.print("1");
else out.print("0");
}
out.println();
}
//强制将数据全部输出至控制台,否则在程序结束时未完全输出,导致数据丢失
out.flush();
}
}

浙公网安备 33010602011771号