UVa 10112 - Myacm Triangles
来源:互联网 发布:战舰世界法拉格特数据 编辑:程序博客网 时间:2024/05/16 07:59
传送门UVa 10112 - Myacm Triangles
总算让我做出一题了.
题目前面都在扯蛋, 我还看了半天
题意是给出几个点, 让我们找出一个面积最大且内部(包括边界)没有点的三角形.
想不出更好的办法, 只好枚举了.
我的思路是先计算面积是否大于当前的最大面积, 如果是, 再判断他的内部有没有点. 如果没有, 记录顶点.
注意计算面积的时候要取绝对值,被这里坑了一次
判断一个点是否在一个三角形中, 我采用的是叉乘法.
详情请点这里.
叉乘法判断点是否在三角形内
详情见代码
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>using namespace std;struct point{ char name; int x, y;};double CalcuS(int i, int j, int k);bool Judge(int x, int i, int j, int k);void Record(int i, int j, int k);int comp(const void *_a, const void *_b){ char *a = (char *)_a; char *b = (char *)_b; return *a - *b;}point dian[50];char temp[10];int main(){ //freopen("input.txt", "r", stdin); int n; int i, j, k, l; double S, Smax; while (scanf("%d", &n)) { memset(temp, 0, sizeof(temp)); memset(dian, 0, sizeof(dian)); getchar(); if (n == 0) break; for (i = 0; i < n; i++) { scanf("%c%d%d", &dian[i].name, &dian[i].x, &dian[i].y); getchar(); } Smax = -1; for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { for (k = j + 1; k < n; k++) { S = CalcuS(i, j, k); if (S <= Smax || S == 0) continue; else { for (l = 0; l < n; l++) //扫描除了三点以外的所有的点 { if (l == i || l == j || l == k) //如果是现在的点就跳过. continue; if (Judge(l, i, j, k) == true) //如果有点在这三点里面, 不符合要求. break; } if (l == n) //符合要求的, 记录字母, 和最大面积 { Smax = S; Record(i, j, k); } } } } } qsort(temp, 3, sizeof(temp[0]), comp); //排序 printf("%s\n", temp); } return 0;}void Record(int i, int j, int k){ temp[0] = dian[i].name; temp[1] = dian[j].name; temp[2] = dian[k].name;}double CalcuS(int i, int j, int k){ return 0.5 * fabs(((dian[k].y - dian[i].y) * (dian[j].x - dian[i].x) - (dian[j].y - dian[i].y) * (dian[k].x - dian[i].x)));}bool Judge(int M, int i, int j, int k){ int a, b, c; int x = dian[M].x; int y = dian[M].y; point MA, MB, MC; MA.x = dian[i].x - x; MA.y = dian[i].y - y; MB.x = dian[j].x - x; MB.y = dian[j].y - y; MC.x = dian[k].x - x; MC.y = dian[k].y - y; a = MA.x * MB.y - MB.x * MA.y; b = MB.x * MC.y - MC.x * MB.y; c = MC.x * MA.y - MA.x * MC.y; if (a >= 0 && b >= 0 && c >= 0 || a <= 0 && b <= 0 && c <= 0) return true; else return false;}
0 0
- UVa 10112 Myacm Triangles
- uva 10112 - Myacm Triangles
- UVA-10112 - Myacm Triangles
- UVa 10112 - Myacm Triangles
- UVa 10112 - Myacm Triangles
- Uva 10112 - Myacm Triangles
- uva 10112 Myacm Triangles
- UVA 10112 Myacm Triangles
- UVA 10112 - Myacm Triangles
- uva 10112 Myacm Triangles
- UVa 10112 - Myacm Triangles
- UVa 10112 - Myacm Triangles
- Uva 10112 Myacm Triangles
- UVA - 10112 Myacm Triangles
- UVA - 10112 Myacm Triangles
- UVA - 10112 Myacm Triangles
- UVA 10112 Myacm Triangles
- UVA - 10112 Myacm Triangles
- 转载 由笑话体悟人生
- 解决 Office 2007/2010/2013 安装错误:1402
- 设计模式之总结(一)
- awk编程
- java.lang.IllegalStateException: Web app root system property already set to different value .
- UVa 10112 - Myacm Triangles
- 执行代码
- linux目录之——/sys
- 八数码的八境界
- 树状数组---整理网上的资料
- cf 420D. Cup Trick (Splay树)
- 同感
- 类似微信的聊天界面ListView
- 从控制台读程序