題意:小度熊有乙個桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把這些矩形包圍起來的面積最小的矩形的面積是多少。
求個凸包,矩形的邊一定在凸包上,列舉邊,求最大值,即為所求,多年不拍幾何,直接套了個模板
以後還得練練
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8view codeusing
namespace
std;
9 typedef double
typev;
10const
double eps = 1e-8;11
const
int n = 4055;12
int sign(double
d)15
struct
point
21 point operator-(point d)
27 point operator+(point d)
33void read()
34}ps[n],pd[n];
35int
n, cn;
36double
dist(point d1, point d2)
39double
dist2(point d1, point d2)
42bool
cmp(point d1, point d2)
45//
st1-->ed1叉乘st2-->ed2的值
46typev xmul(point st1, point ed1, point st2, point ed2)
49typev dmul(point st1, point ed1, point st2, point ed2)
52//
多邊形類
53struct
poly
58//
加進乙個點
59void
push(point tp)
62//
第k個位置
63int trim(int
k)66
void clear()
67};
68//
返回含有n個點的點集ps的凸包
69 poly graham(point* ps, int
n)76
return
ans;77}
78 ans.push(ps[0
]);79 ans.push(ps[1
]);80 point* tps =ans.ps;
81int top = -1
;82 tps[++top] = ps[0
];83 tps[++top] = ps[1
];84
for(int i = 2; i < n; i++)
88int tmp = top; //
注意要賦值給tmp!
89for(int i = n - 2; i >= 0; i--)
93 ans.pn =top;
94return
ans;95}
96//
求點p到st->ed的垂足,列引數方程
97point getroot(point p, point st, point ed)
105//
next為直線(st,ed)上的點,返回next沿(st,ed)右手垂直方向延伸l之後的點
106 point change(point st, point ed, point next, double
l)116
//求含n個點的點集ps的最小面積矩形,並把結果放在ds(ds為乙個長度是4的陣列即可,ds中的點是逆時針的)中,並返回這個最小面積。
117double getminarearect(point* ps, int n, point*ds)else
138for(r=u=i = 0; i < cn; i++)
143while(dmul(con[i], con[i+1
], con[i], con[r])
144<= dmul(con[i], con[i+1], con[i], con[(r+1)%cn]))
147while(dmul(con[i], con[i+1
], con[i], con[l])
148 >= dmul(con[i], con[i+1], con[i], con[(l+1)%cn]))
151 tmp = dmul(con[i], con[i+1], con[i], con[r]) - dmul(con[i], con[i+1
], con[i], con[l]);
152 tmp *= xmul(con[i], con[i+1
], con[i], con[u]);
153 tmp /= dist2(con[i], con[i+1
]);154 len = xmul(con[i], con[i+1], con[i], con[u])/dist(con[i], con[i+1
]);155
if(sign(tmp - ans) < 0
)162
}163
}164
return ans+eps;
165}
166int
main()
167183
double q=getminarearect(ps,4*n,pd);
184 printf("
%d\n
",int(q+0.5
));185
}186 }
hdu5251 凸包 旋轉卡殼
傳送門 hdu5251 矩形面積 接觸了旋轉卡殼不久,感覺很神奇 這個題是要尋找乙個矩形來覆蓋住桌面上的小矩形,小矩形即四個點啦,所以就是 找乙個矩形覆蓋住這些點,也就要求乙個凸包,再用矩形把凸包蓋住,那就很明顯的 是旋轉卡殼了,類似旋轉卡殼求凸包的寬度,只是這是求矩形面積的最小值 完整 inclu...
面試題41 包圍區域
包圍區域是乙個典型的dfs的題目。大意是乙個二維陣列中存在字元 x 和 o 將被 x 包圍的 o 全部變為 x 具體做法是從陣列的邊界上為 o 的起點開始dfs,將dfs過程中遇到的字元標記為 y 然後遍歷二維陣列,將 y 的變為 o 其餘為 x 即可。題目描述 given a 2d board c...
Untiy網格程式設計篇 一 包圍盒效果
untiy網格程式設計篇 一 包圍盒效果 純 網格實現 1.效果圖 選中不同的模型,會標識出包圍盒的效果 2.實現思路 第一步 計算模型的aabb包圍盒 第三步 設定網格頂點和網格的三角面 第四步 得到上圖的效果 3.部分 using unityengine using system.collect...