题目链接:http://codeforces.com/problemset/problem/635/A
Sample Input
2 2 1 1 1 2
4
3 2 3 3 1 1 3 1 2 2
1
3 2 3 2 1 1 3 1 2 2
4
___________________________________________________________________________________________________________________________________
这个题目的意思就是存在r*c这样一个矩形,里面有n个标记的点,要求所找的矩形最少包含k个所标记的点。
这道题一开始我看题目都看不懂,后来还是别人讲解了我才明白。
我一开始只打算用四个循环,确定思路就是暴力搜索,先用两层循环来得出一个点,然后在接下来两个循环里面开始算矩形。但是这怎么算都算不对,很多细节的地方是根本无法解决,牵一发而动全身。
于是我又用了一天的时间去想这道题,最后大致想到,应该用六个循环才可以,而且这样算不用太多细节,我再推了推这个时间复杂度,因为r和c最大是10,所以时间复杂度是10的六次方,就是一百万,这个数字对于计算机运算量是算少的了,不会超时。
思路就是:先创建一个12*12的数组,存放各个点的情况,标记的点记为1,没有标记的点为0
依然是先用两层循环从所给矩形中得出一个点的坐标,放入find函数里面,当作寻找矩形的起始坐标,
再用两层循环,在起始坐标的基础上往后面走,这时候开始构造矩形,得出一个末尾的x,y坐标来围成一个矩形
再用两层循环,将初始位置依然当作初始位置,这向后走得出的坐标就作为终点位置,直接计算确立的矩形内的各个点的和,是否大于k,大于就让计数po加上1
代码实现:
#include<stdio.h>
int r,c,n,k,po;
int spot[12][12];
void find(int x, int y)
{
int i,j,n,m,sum = 0;
for(i = x; i < r; i++)
for(j = y; j < c; j++)//构造矩形
{
for(n = x; n <= i; n++)
for(m = y; m <= j; m++)//计算矩形内各个点存放的数之和 ,最好不要有局部变量跟全局变量名字相同,但是思路清晰也还行吧
{
sum+=spot[n][m];
}
if(sum >= k)
po++;
sum = 0;
}
}
int main()
{
int i,j,a,b;
po = 0;
while(scanf("%d%d%d%d",&r,&c,&n,&k)!=EOF)
{
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
spot[i][j]=0;
while(n--)
{
scanf("%d%d",&a,&b);
spot[a-1][b-1] = 1;
}
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
find(i,j);
printf("%d\n",po);
po = 0;
}
}