nyoj487点数
来源:互联网 发布:mac如何设置用户头像 编辑:程序博客网 时间:2024/04/30 11:24
点数
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
- 在一个二维的坐标系内有三个点,这三个点构成一个三角形,请你求出这个三角形内部和边界上的坐标点一共有多少个。
- 输入
- 输入三个整数点,坐标x,y均为1~99的整数。注意:程序以文件结束符“EOF”结束输入。
- 输出
- 按要求输出点的个数,每个点占一行.
- 样例输入
0 0 0 1 3 00 0 2 0 0 2
- 样例输出
56
- 我的思路:设三角形三点为a,b,c,待检测点为d。
- 若满足:d和c在过ab的直线的同一侧,且d和a在过bc的直线的同一侧,且d和b在过ac的直线的同一侧。
- 或 在三边的任意一边上
- 测试数据来几发
- 0 0 1 1 2 2
- 8 2 9 1 3 5
- 7 9 3 1 9 8
- 答案
- 3
- 4
- 14
- 丑陋的AC代码
#include <stdio.h>#include <math.h>struct point{double x,y;}p[3];int onLine(point A[],double Dx, double Dy) {double k, b, tCy, tDy, tx, ty;for(int i = 0; i < 3; i++) {tx = A[i].x-A[(i+1)%3].x;ty = A[i].y-A[(i+1)%3].y;k = ty / tx;b = A[i].y - k*A[i].x;tDy = k*Dx + b;if(fabs(fabs(A[i].x-Dx)+fabs(A[(i+1)%3].x-Dx)-fabs(tx))<1e-6&&fabs(fabs(A[i].y-Dy)+fabs(A[(i+1)%3].y-Dy)-fabs(ty))<1e-6)if((fabs(A[i].x-A[(i+1)%3].x)<1e-6&&fabs(A[i].x-Dx)<1e-6)||(fabs(A[i].y-A[(i+1)%3].y)<1e-6&&fabs(A[i].y-Dy)<1e-6)||(fabs(tDy-Dy)<1e-6)) {return 1;//在三边的任意一边上就符合 }}return 0;}int getfg(point A, point B,point C,double Dx, double Dy) {int f1, f2;double k, b, tCy, tDy;k = (A.y-B.y) / (A.x-B.x);b = A.y - k*A.x;tCy = k*C.x + b;tDy = k*Dx + b;if(fabs(A.x - B.x) < 1e-6) {if(C.x < A.x) f1 = -1;else if(C.x > A.x) f1 = 1;else f1 = 0;if(Dx < A.x) f2 = -1;else if(Dx > A.x) f2 = 1;} else if(fabs(k-0) < 1e-6) {if(C.y < A.y) f1 = -1;else if(C.y > A.y) f1 = 1;else f1 = 0;if(Dy < A.y) f2 = -1;else if(Dy > A.y )f2 = 1;} else {if(C.y > tCy) f1 = -1;else if(C.y < tCy)f1 = 1;else f1 = 0;if(Dy > tDy) f2 = -1;else if(Dy < tDy) f2 = 1;}if(f1*f2 > 0) return 1;//表示同侧else return 0;}int main() {double minX, maxX, minY, maxY;int i, j;while(~scanf("%lf%lf", &p[0].x, &p[0].y)) {int count = 0;maxX = p[0].x, maxY = p[0].y;minX = maxX, minY = maxY;for(i = 1; i < 3; i++) {scanf("%lf%lf", &p[i].x, &p[i].y);if(p[i].x > maxX) maxX = p[i].x;if(p[i].x < minX) minX = p[i].x;if(p[i].y > maxY) maxY = p[i].y;if(p[i].y < minY) minY = p[i].y;}//用外包最小矩形的方法缩小要查找的范围 for(i = minX; i <= maxX; i++) {for(j = minY; j <= maxY; j++) {if(onLine(p,i,j)||getfg(p[0],p[1],p[2],i,j) && getfg(p[1],p[2],p[0],i,j) && getfg(p[0],p[2],p[1],i,j)) {count++;}}}printf("%d\n", count);}return 0;}
0 0
- nyoj487点数
- 点数
- 随机数例子 筛子点数
- 24点数学游戏
- 自动跃点数
- 骰子点数的概率
- 输出骰子点数
- 算各种点数
- 骰子点数问题
- 采样率 窗口点数
- metric跃点数含义
- 求圆上和谐点数
- Jzoj3927 可见点数
- 学点数学吧
- 寻找平面内共线点数最多的直线和点数
- 部门ID 员工ID 点数
- 今天点数首次破10
- n个骰子的点数
- 【uva 11729】Commando War
- python写的购物车小程序
- HDU 3394 Railway (点双联通分量+桥)
- Linux学习笔记7——umask函数
- 关于阻止scroll()事件多次执行的一个小方法
- nyoj487点数
- HDU3549 ISAP板子题
- 字符串库
- 仿淘宝详细页面图片放大镜的制作过程
- Effective-Java-Note-类和接口
- JavaSE总结-集合框架-List
- 搜索引擎技术之概要预览
- uml类图详解
- Easyui Tree跨域获取数据。