这道题写的时候先用暴力解题只能过30%
后面看题解也看不懂,于是慢慢了解一维差分,二维差分,二维前缀和
题目也就迎刃而解了,如果不了解上面基础算法得小伙伴可以先学习一下,解题事半功倍。
二维差分教学连接:二维差分_哔哩哔哩_bilibili
就直接二维差分求前缀和,然后只要翻一次棋就加一,最后判断结果是奇数位黑偶数为白。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int arr[][] =new int[n+2][n+2];
while (m-->0){
addNum(sc.nextInt(),sc.nextInt(),sc.nextInt(),sc.nextInt(),arr);
}
getSum(arr);
print(arr);
}
// addNum 二维差分标记
public static void addNum(int x1,int y1,int x2,int y2,int[][] arr){
arr[x1][y1]+=1;
arr[x2+1][y1]-=1;
arr[x1][y2+1]-=1;
arr[x2+1][y2+1]+=1;
}
// getSum 做前缀和
public static void getSum(int[][] arr){
for (int i=1;i<arr.length;i++){
for (int j=1;j<arr[0].length;j++){
arr[i][j]+=arr[i][j-1]+arr[i-1][j]-arr[i-1][j-1];
}
}
}
// print 打印数组
public static void print(int[][] arr){
for (int i=1;i<arr.length-1;i++){
for (int j=1;j<arr[0].length-1;j++){
if (arr[i][j]%2==0)
System.out.print(0);
else System.out.print(1);
}
System.out.println();
}
}
}