HDU 5128 The E-pang Palace 【暴力】

版权声明:如需转载,记得标识出处 https://blog.csdn.net/godleaf/article/details/82973757

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128

题意:给出N个点,由这些点构成两个矩形,矩形是平行于x轴的,而且不能相交不能相邻(共用同一边),如果存在就输出面积和否则输出imp

思路:

这里要注意的是,如果长宽知道的情况下可以通过一个角落的点确定一个矩形,如果不知道长宽,一个对角线确定一个矩形;

这题有个比较坑的地方就是包含的情况,如果两个矩形包含是合法的,面积为最大的那个;

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <algorithm>

using namespace std;

struct Node {
	int x, y;
} p[40];

int have[210][210];

int check (Node i, Node j, Node k, Node L) {
	int Left = min (k.x, L.x), Right = max (k.x, L.x);
	int down = min (k.y, L.y), up = max (k.y, L.y);
	if (Left > max (i.x, j.x)) return 1;
	else if (Right < min (i.x, j.x)) return 1;
	else if (up < min (i.y, j.y)) return 1;
	else if (down > max (i.y, j.y)) return 1;
	else if (min (i.x, j.x) < Left && max (i.x, j.x) > Right && // 两个矩形包含的情况 返回 2 
				min (i.y, j.y) < down && max (i.y, j.y) > up) return 2;
	else if (min (i.x, j.x) > Left && max (i.x, j.x) < Right && 
				min (i.y, j.y) > down && max (i.y, j.y) < up) return 2;
	else return 0; // 返回0说明不符合条件 
}

int main (void)
{
	int N;
	while (scanf ("%d", &N) != EOF) {
		if (!N) break;
		memset (have, 0, sizeof (have));
		for (int i = 1; i <= N; ++i) scanf ("%d%d", &p[i].x, &p[i].y),have[p[i].x][p[i].y] = i;
		int ans = 0, tmp;
		for (int i = 1; i <= N; ++i) {
			for (int j = i+1; j <= N; ++j) {  // 选对角线的第二个点的时候要注意不能选和第一点同x或者同y的点 
				if (p[i].x == p[j].x || p[i].y == p[j].y ||  // 用have存x,y对应的p下标,如果是0,则不存在 
						!have[p[i].x][p[j].y] || !have[p[j].x][p[i].y]) continue;
						
				tmp = abs (p[i].x-p[j].x)*abs (p[i].y-p[j].y);
				for (int k = 1; k <= N; ++k) { // 第一个矩形选好后第二个矩形的第一个对角线的点要跳过第一个矩形的四个点 
					if (k == i || k == j || k == have[p[i].x][p[j].y] 
									|| k == have[p[j].x][p[i].y]) continue;
					for (int L = 1; L <= N; ++L) { 
						int od = check (p[i], p[j], p[k], p[L]); // 判断两个矩形是否合法 
						if (L == k || L == i || L == j || p[k].x == p[L].x || p[k].y == p[L].y ||
								L == have[p[i].x][p[j].y] || L == have[p[j].x][p[i].y] ||
							 	!have[p[k].x][p[L].y] || !have[p[L].x][p[k].y] || !od) continue;
						
						int index = abs (p[k].x-p[L].x)*abs (p[k].y-p[L].y);
						if (od == 2) ans = max (ans, max (tmp, index));
						else ans = max (tmp+index, ans);
					}
				}
			}	
		}
		if (ans == 0) printf ("imp\n");
		else printf ("%d\n", ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/godleaf/article/details/82973757