洛谷P1959题解

本题是寻找正方形,由数学知识可知,已经正方形的两个顶点坐标,即可求出其另外两个点坐标,具体代码如下

x = b[i] - b[j];
			y = c[i] - c[j];
			p = b[i] - y;
			q = c[i] + x;
			h = b[j] - y;
			k = c[j] + x;
点(p,q),(h,k),(b[i],c[i]),(b[j],c[j])构成正方形

知道了这一步后,如果这两个点均存在的话,由勾股定理即可求出正方形面积。

下面附上代码

#include <iostream>
using namespace std;
int a[5005][5005], n,x,y,z,k,h,p,q,b[3005],c[3005],ans;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> x >> y;
		b[i] = x;
		c[i] = y;
		a[x][y] = 1;
	}
	for(int i=1;i<=n;i++)
		for (int j =1; j <= n; j++)
		{
			x = b[i] - b[j];
			y = c[i] - c[j];
			p = b[i] - y;
			q = c[i] + x;
			h = b[j] - y;
			k = c[j] + x;
			if (p < 1 || p>5000 || h < 1 || h>5000 || q < 1 || q>5000 || k < 1 || k>5000)
				continue;
			if (a[p][q] == 1 && a[h][k] == 1)
			{
				ans = max(ans, x * x + y * y);
			}
		}
	cout << ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值