棋盘问题

【问题描述】

小蓝拥有 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

【解题思路】

  • 用 Sanner scan = new Scanner (System.in) 会读取慢,有运行超时的样例。

  • 所以用 StreamTokenizer st = new StreamTokenizer(new BufferedReader(InputStreamReader(System.in)));

  • 数组默认初始化的值是0,可以不用初始化给棋盘赋值0。

    1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.io.StreamTokenizer; 5 import java.util.Scanner; 6 7 public class Main { 8 private static final StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 9 10 public static void main(String[] args) throws IOException { 11 // Scanner sc = new Scanner(System.in); 12 // 13 // int n = sc.nextInt(); 14 // int m = sc.nextInt(); 15 int n = next(); 16 int m = next(); 17 int[][] qipan = new int[n][n];//棋盘大小 18 19 // //初始化棋盘,全是白色 20 // for (int i = 0; i < qipan.length; i++) { 21 // for (int j = 0; j < qipan[0].length; j++) { 22 // qipan[i][j] = 0; 23 // } 24 //// } 25 for (int i = 0; i < m; i++) { 26 int x1, x2, y1, y2; 27 x1 = next(); 28 y1 = next(); 29 x2 = next(); 30 y2 = next(); 31 for (int j = x1 - 1; j < x2; j++) { 32 for (int k = y1 - 1; k < y2; k++) { 33 if (qipan[j][k] == 0) { 34 qipan[j][k] = 1; 35 } else { 36 qipan[j][k] = 0; 37 } 38 } 39 } 40 } 41 for (int j = 0; j < qipan.length; j++) { 42 for (int k = 0; k < qipan[j].length; k++) { 43 System.out.print(qipan[j][k]); 44 } 45 System.out.println(); 46 } 47 // 48 // sc.close(); 49 } 50 51 private static int next() throws IOException { 52 st.nextToken(); 53 return (int) st.nval; 54 } 55 }