Uva 10112 【简单的计算几何】.cpp

题意:

  给出n个点的x坐标和y坐标,让你求出由其中三个点组成的三角形,要求这个三角形里面不包含别的点且面积最小。

思路:

  三角形里面不包含别的点的判断方法是最暴力的一层for循环用面积法看看除去组成这个三角形以外的别的点是否在这个三角形内。

Tips:

  这题的关键其实只是掌握面积法。即利用差积的方法求面积。

Code:

View Code
 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <ctime>
 6 using namespace std;
 7 #define eps 1e-8
 8 
 9 struct Point
10 {
11     char num;
12     double x;
13     double y;
14 }po[20];
15 
16 double xmul(Point a, Point b, Point c) {
17     return (c.y-a.y)*(b.x-a.x)-(b.y-a.y)*(c.x-a.x);
18 }
19 
20 double area(Point a, Point b, Point c)
21 {
22     return fabs(0.5*xmul(a, b, c));
23 }
24 
25 bool isin(Point a, Point b, Point c, Point p) {
26     return fabs(area(a, b, p)+area(a, c, p)+area(b, c, p)-area(a, b, c)) < eps;
27 }
28 
29 int main()
30 {
31     Point a, b, c;
32     bool flag;
33     int n;
34     double tar;
35     while(EOF != scanf("%d", &n)) {
36         if(n == 0) break;
37         tar = -1;
38         for(int i = 0; i < n; ++i) {
39             scanf("%*c%c %lf %lf", &po[i].num, &po[i].x, &po[i].y);
40          //   printf("%c %lf %lf\n", po[i].num, po[i].x, po[i].y);
41         }
42         for(int i = 0; i < n; ++i)
43             for(int j = i+1; j < n; ++j)
44                 for(int k = j+1; k < n; ++k) {
45                     flag = true;
46                     for(int t = 0; t < n; ++t)
47                         if(t != i && t != j && t != k && isin(po[i], po[j], po[k], po[t])) {
48                             flag = false;
49                             break;
50                         }
51                     if(flag && fabs(area(po[i], po[j], po[k]) > tar+eps)) {
52                         a = po[i], b = po[j], c = po[k];
53                         tar = area(po[i], po[j], po[k]);
54                     }
55                 }
56         printf("%c%c%c\n", a.num, b.num, c.num);
57     }
58     return 0;
59 }

 

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=101&page=show_problem&problem=1053

转载于:https://www.cnblogs.com/Griselda/archive/2013/03/16/2963855.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值