
二维差分数组可以根据二维前缀和数组移项得到,对二维差分数组b[i][j]加或者减去一个数,就意味着计算二维前缀和数组后的原数组从这个点开始到最后一个点的矩形都加上或者减去这个数。所以可以根据上面的计算。
java
package com.js.datastructure.recursion.蓝桥;
import java.util.Scanner;
public class 二维差分 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int q = scanner.nextInt();
int[][] a = new int[n+2][m+2];
//操作完成后可以直接在差分数组上求前缀和
int[][] b = new int[n+2][m+2];
//计算差分数组
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < m+1; j++) {
a[i][j] = scanner.nextInt();
b[i][j] = a[i][j] - a[i-1][j] - a[i][j-1] + a[i-1][j-1];
}
}
//进行操作
for (int i = 0; i < q; i++) {
int x1 = scanner.nextInt();
int y1 = scanner.nextInt();
int x2 = scanner.nextInt();
int y2 = scanner.nextInt();
int d = scanner.nextInt();
b[x1][y1] += d;
b[x2+1][y1] -= d;
b[x1][y2+1] -= d;
b[x2+1][y2+1] += d;
}
//计算前缀和并输出原数组
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < m+1; j++) {
b[i][j] = b[i][j] + b[i-1][j] + b[i][j-1] - b[i-1][j-1];
System.out.print(b[i][j] + " ");
}
System.out.println();
}
}
}