#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int m[50][50];
int rui[50][50];
int det[50][50][50][50];
int ans[50][50][50][50];
int x,y,q;
char str[50];
int main()
{
scanf("%d%d%d",&x,&y,&q);
for(int i=0;i<x;i++)
{
scanf("%s",str);
for(int j=0;j<y;j++)
{
m[i][j]=str[j]-'0';
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
rui[i+1][j+1]=rui[i+1][j]+rui[i][j+1]-rui[i][j]+m[i][j];
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
for(int k=i;k<x;k++)
{
for(int l=j;l<y;l++)
{
if(rui[k+1][l+1]+rui[i][j]-rui[i][l+1]-rui[k+1][j]==0)
{
det[i][j][k][l]=1;
}
}
}
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
for(int k=0;k<x;k++)
{
for(int l=0;l<y;l++)
{
ans[i+1][j+1][k+1][l+1]
=ans[i][j+1][k+1][l+1]
+ans[i+1][j][k+1][l+1]
+ans[i+1][j+1][k][l+1]
+ans[i+1][j+1][k+1][l]
-ans[i][j][k+1][l+1]
-ans[i][j+1][k][l+1]
-ans[i][j+1][k+1][l]
-ans[i+1][j][k][l+1]
-ans[i+1][j][k+1][l]
-ans[i+1][j+1][k][l]
+ans[i+1][j][k][l]
+ans[i][j+1][k][l]
+ans[i][j][k+1][l]
+ans[i][j][k][l+1]
-ans[i][j][k][l]
+det[i][j][k][l];
}
}
}
}
while(q--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--; b--; c--; d--;
printf("%d\n",
ans[c+1][d+1][c+1][d+1]
-ans[a][d+1][c+1][d+1]
-ans[c+1][b][c+1][d+1]
-ans[c+1][d+1][a][d+1]
-ans[c+1][d+1][c+1][b]
+ans[a][b][c+1][d+1]
+ans[a][d+1][a][d+1]
+ans[a][d+1][c+1][b]
+ans[c+1][b][a][d+1]
+ans[c+1][b][c+1][b]
+ans[c+1][d+1][a][b]
-ans[c+1][b][a][b]
-ans[a][d+1][a][b]
-ans[a][b][c+1][b]
-ans[a][b][a][d+1]
+ans[a][b][a][b]
);
}
return 0;
}
一种更加简洁的写法。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, q, sum[50][50], ct[50][50][50][50];
char map[50][50];
int main()
{
cin >> n >> m >> q;
for (int i = 0; i < n; i++)
{
cin >> map[i];
}
for (int i = n - 1; i >= 0; i--)
{
for (int j = m - 1; j >= 0; j--)
{
sum[i][j] = sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1] + (map[i][j] == '1');
}
}
for (int x1 = n - 1; x1 >= 0; x1--)
{
for (int x2 = x1 + 1; x2 <= n; x2++)
{
for (int y1 = m - 1; y1 >= 0; y1--)
{
for (int y2 = y1 + 1; y2 <= m; y2++)
{
int &c = ct[x1][y1][x2][y2];
c = ct[x1 + 1][y1][x2][y2]
+ ct[x1][y1 + 1][x2][y2]
+ ct[x1][y1][x2 - 1][y2]
+ ct[x1][y1][x2][y2 - 1]
- ct[x1][y1][x2 - 1][y2 - 1]
- ct[x1][y1 + 1][x2][y2 - 1]
- ct[x1][y1 + 1][x2 - 1][y2]
- ct[x1 + 1][y1][x2][y2 - 1]
- ct[x1 + 1][y1][x2 - 1][y2]
- ct[x1 + 1][y1 + 1][x2][y2]
+ ct[x1][y1 + 1][x2 - 1][y2 - 1]
+ ct[x1 + 1][y1][x2 - 1][y2 - 1]
+ ct[x1 + 1][y1 + 1][x2][y2 - 1]
+ ct[x1 + 1][y1 + 1][x2 - 1][y2]
- ct[x1 + 1][y1 + 1][x2 - 1][y2 - 1];
if (sum[x1][y1] - sum[x1][y2] - sum[x2][y1] + sum[x2][y2] == 0) c++;
}
}
}
}
while (q--)
{
int a, b, c, d;
cin >> a >> b >> c >> d;
a--; b--;
cout << ct[a][b][c][d] << endl;
}
return 0;
}