vijos P1134 矩形覆盖 题解
2016-01-28 21:18
260 查看
4000
这题就是最简单的dfs
用dfs 搜索每一个点所在的矩形 然后对矩形的面积进行改变(也可以不改变)
numRect 表示使用的矩形个数
rect[].isEmpty 记录矩形是否被使用
rect[].l,r,t,b 表示矩形的左边界 右边界 上边界 下边界
verify() 函数和intersect()函数是用于判断矩形是否有交叉部分
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) typedef struct { short isEmpty; int l, r, t, b; //left, right, top, bottom } RECT; typedef struct { int x, y; } POINT; int numPoint, numRect; int minArea = LONG_MAX; POINT point[55]; RECT rect[5]; void dfs(int index, int area); int intersect(RECT a, RECT b); int verify(); int main() { int i; scanf("%d %d", &numPoint, &numRect); for(i=0; i<numPoint; i++) scanf("%d %d", &point[i].x, &point[i].y); for(i=0; i<numRect; i++) rect[i].isEmpty = 1; //printf("%d",minArea); dfs(0, 0); printf("%d\n", minArea); return 0; } int intersect(RECT a, RECT b) //see: http://blog.csdn.net/yahohi/article/details/7927158 { int dx, dy; dx = abs((a.r+a.l) - (b.r+b.l)); dy = abs((a.t+a.b) - (b.t+b.b)); if(dx <= a.r-a.l + b.r-b.l && dy <= a.t-a.b + b.t-b.b) return 1; return 0; } int verify() //if any two rectangles intersect, return false { int i, k; for(i=0; i<numRect; i++) { if(rect[i].isEmpty) continue; for(k=i+1; k<numRect; k++) { if(rect[k].isEmpty) continue; if(intersect(rect[i], rect[k])) return 0; } } return 1; } void dfs(int index, int area) { int i, delta; RECT tmp; if(area >= minArea) return; if(index == numPoint) { for(i=0; i<numRect; i++) { if(rect[i].isEmpty) return; } minArea = area; return; } for(i=0; i<numRect; i++) { tmp = rect[i]; if(rect[i].isEmpty) { rect[i].l = rect[i].r = point[index].x; rect[i].b = rect[i].t = point[index].y; rect[i].isEmpty = 0; }else { rect[i].l = MIN(rect[i].l, point[index].x); rect[i].r = MAX(rect[i].r, point[index].x); rect[i].b = MIN(rect[i].b, point[index].y); rect[i].t = MAX(rect[i].t, point[index].y); } if(verify()) { delta = (rect[i].r-rect[i].l) * (rect[i].t-rect[i].b); //new area delta -= (tmp.r-tmp.l) * (tmp.t-tmp.b); //-= original area dfs(index+1, area+delta); } rect[i] = tmp; } }
这题就是最简单的dfs
用dfs 搜索每一个点所在的矩形 然后对矩形的面积进行改变(也可以不改变)
numRect 表示使用的矩形个数
rect[].isEmpty 记录矩形是否被使用
rect[].l,r,t,b 表示矩形的左边界 右边界 上边界 下边界
verify() 函数和intersect()函数是用于判断矩形是否有交叉部分
相关文章推荐
- VIJOS P1040 高精度乘法
- VIJOS P1000 A+B Problem
- vijos P1051 送给圣诞夜的极光
- vijos P1131 最小公倍数和最大公约数问题 题解
- vijos P1320 清点人数 题解
- vijos P1597 2的幂次方 题解(递归)
- vijos P1134 算24点 题解
- vijos1057
- Vijos P1775 乌龟棋 题解
- Vijos P1133 装箱问题 题解
- Vijos P1098 合唱队形题解
- 孙子定理(中国剩余定理)
- 扩展欧几里德
- 第七讲 有依赖的背包问题 vijos P1313金明的预算方案
- 第一讲 01背包问题 vijos P1025小飞侠的游园方案
- vijos P1059积木城堡
- vijos P1071新年趣事之打牌
- 【vijos】P1016北京2008的挂钟
- 【vijos】P1082丛林探险DFS+剪枝版本
- 【P1843】货车运输(最大生成树+LCA)