六个循环暴力搜索—寻找矩形

A - Orchestra
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

题目链接:http://codeforces.com/problemset/problem/635/A

Sample Input

Input
2 2 1 1
1 2
Output
4
Input
3 2 3 3
1 1
3 1
2 2
Output
1
Input
3 2 3 2
1 1
3 1
2 2
Output
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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值