棋盘

棋盘

题目描述

小蓝拥有 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();
    }
}
posted @ 2025-04-08 18:01  狐狸胡兔  阅读(22)  评论(0)    收藏  举报