首先我们需要明确的是在矩阵中每个数占的是一个方格
而不是一个点,然后上代码
#include<iostream>
using namespace std;
const int N = 1010;
int q[N][N];
int main()
{
int n, m, x;
scanf("%d%d%d", &n, &m, &x);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &q[i][j]);//输入n行m列的矩阵
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
q[i][j] += q[i-1][j] + q[i][j-1] - q[i-1][j-1];
//其实可以写成这样更好理解q[i][j] = q[i-1][j] + q[i][j-1] - q[i-1][j-1] + q[i][j];
//然后这个表达的意思是 对于x = i ,y = j的前缀和
//那为什么呢
//因为, 我们可以进行模拟一下,发现当i=1, j=1时, 这个表达的意思是其的前缀和,
然后储存, i=1, j=2时, 在第一个的基础上进行累加,表达的是当前的前缀和,
以此类推,所以这两个for循环其实有点递归调用的意思(我不知道我理解的对不对),每次都是调用公式
在前一次的基础上进行累加然后储存
//经过以上后我们得到了每个i和j对应前缀和
//此时的q数组值发生了改变
while(x --)//x次的询问
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
printf("%d\n", q[x2][y2] - q[x2][y1-1] - q[x1-1][y2] + q[x1-1][y1-1]);
//这里套公式就好了
}
return 0;
}
那里理解错了请大佬指正,