zoj 1426 Counting Rectangles

先把交点全求出来
然后依据一个左下角和一个右上角确定一个长方形
在判断这个长方形是否连续即可

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iomanip>
#include <vector>
#include <map>
#include <math.h>
using namespace std;
int rem[1001][1001];

struct pot {
	int x, y;
};
vector<pot> pt;
struct line {
	int x1, y1;
	int x2, y2;
};
vector<line> hori;
vector<line> vert;

bool cmp(pot p1, pot p2) {
	if (p1.x != p2.x)return p1.x < p2.x;
	return p1.y < p2.y;
}

bool judge(int x1, int y1, int x2, int y2) {
	int i;
	if (x1 == x2) {
		if (y1 > y2) swap(y1, y2);

		for (i = 0; i < vert.size(); i++) {
			if (vert[i].x1 == x1 && vert[i].y1 <= y1 && vert[i].y2 >= y2) {
				return true;
			}
		}
	} else {
		if (x1 > x2)swap(x1, x2);

		for (i = 0; i < hori.size(); i++) {
			if (hori[i].y1 == y1 && hori[i].x1 <= x1 && hori[i].x2 >= x2) {
				return true;
			}
		}
	}

	return false;
}

int cal() {
	sort(pt.begin(), pt.end(), cmp);
	int i, j, x1, y1, x2, y2;
	int ans = 0;
	for (i = 0; i < pt.size(); i++) {
		x1 = pt[i].x;
		y1 = pt[i].y;
		for (j = i + 1; j < pt.size(); j++) {
			x2 = pt[j].x;
			y2 = pt[j].y;
			if (x2 > x1 && y2 > y1 && rem[x1][y2] && rem[x2][y1]) {
				if (judge(x1, y1, x2, y1) && judge(x1, y1, x1, y2) && judge(x1, y2, x2, y2) && judge(x2, y1, x2, y2))
					ans++;
			}
		}
	}
	return ans;
}

void getpoints() {
	int i, j;
	for (i = 0; i < hori.size(); i++) {
		for (j = 0; j < vert.size(); j++) {
			if (!rem[vert[j].x1][hori[i].y1]
			        && vert[j].x1 >= hori[i].x1 && vert[j].x1 <= hori[i].x2
			        && hori[i].y1 >= vert[j].y1 && hori[i].y1 <= vert[j].y2) {
				pot p = {vert[j].x1, hori[i].y1};
				rem[vert[j].x1][hori[i].y1] = 1;
				pt.push_back(p);
			}
		}
	}
}

int main() {
	int t, n, i, x1, y1, x2, y2;
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		memset(rem, 0, sizeof(rem));
		hori.clear();
		vert.clear();
		pt.clear();
		for (i = 0; i < n; i++) {
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

			if (x1 == x2 && y1 == y2)continue;

			if (x1 == x2) {
				if (y1 > y2) {
					swap(y1, y2);
				}
			} else if (x1 > x2) {
				swap(x1, x2);
			}

			line l = {x1, y1, x2, y2};

			if (x1 == x2) {
				vert.push_back(l);
			} else {
				hori.push_back(l);
			}
		}

		getpoints();
		printf("%d\n", cal());
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值