题目
输入
3
2 2 1 1
1 2
3 2 3 3
1 1
3 1
2 2
3 2 3 2
1 1
3 1
2 2
法一:六重循环
#include<iostream>
using namespace std;
int func(int(*a)[11],int k, int r, int c, int n)
{
int sum = 0;
for(int a1 = 1; a1 <= r; a1++)
{
for(int a2 = 1; a2 <= c; a2++)
{
for(int b1 = 1; b1 <= r; b1++)
{
for(int b2 = 1; b2 <= c; b2++)
{
//确定两点来确定矩形
int z = 0;
for(int c1 = a1; c1 <= b1; c1++)
{
for(int c2 = a2; c2 <= b2; c2++)
{
if(a[c1][c2])
{
z++;
}
}
}
if(z >= k) sum++;
}
}
}
}
return sum;
}
int main()
{
int Qus,k,r,c,n;
cin >> Qus;
for(int j = 0;j < Qus; j++)
{
int a[11][11] = {{0}};
cin >> r >> c >> n >> k;
for(int i = 0;i < n; i++)
{
int x, y;
cin >> x >> y;
a[x][y] = 1;
}
cout << "case #" << j << ":" << endl;
cout << func(a,k,r,c,n) << endl;
}
return 0;
}
需要注意几点
①写函数的时候注意是int (*a)[11]
int *a[11]表示的是一个存放了11个整型指针的数组
int (*a)[11]表示的是一个指向有11个int类型数组的指针
②注意题目数据输入的次序,弄清楚每个循环内部和外部需要输入的数据
③矩形的确定需要两点,4个数据,因此有四重循环来表示所有的矩形,再有1个点需要确定是否包含,两个数据,再加两重循环
法二:二维线段树
学艺不精,日后再补充
法三:空间换时间
#include<iostream>
#include<cstring>
using namespace std;
int a[1000][1000];
int S[1000][1000];
int main()
{
int Qus,k,r,c,n;
cin >> Qus;
for(int z = 0;z < Qus; z++)
{
memset(a,0,sizeof(a));
memset(S,0,sizeof(S));
cin >> r >> c >> n >> k;
for(int i = 0;i < n; i++)
{
int x, y;
cin >> x >> y;
a[x][y] = 1;
}
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
S[i][j] = S[i][j - 1] + S[i - 1][j] - S[i - 1][j - 1] + a[i][j];
long long ans = 0;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
for(int x = i; x <= r; x++)
for(int y = j; y <= c; y++)
if(S[x][y] - S[i - 1][y] - S[x][j - 1] + S[i - 1][j - 1] >= k)
ans++;
cout << "case #" << z << ":" << endl;
cout << ans << endl;
}
}