https://koitp.org/problem/POSITION_OF_POINT

求最后两个点,是在图形的外面,还是里面

换成了double,依然没有AC,只是从30 / 100提升到了90 / 100

换成BigInteger后AC了

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;/**meng3.wei 2020.04.16
4
1 1
1 3
3 3
3 1
0 0
2 2outin*/
public class 点的位置 {static int Max_x=0;static int Max_y=0;public static void main(String[] args) throws  Exception{BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));int N=Integer.parseInt(reader.readLine());Point[] points=new Point[N];for (int i = 0; i <N ; i++) {String[] line=reader.readLine().split(" ");int x=Integer.parseInt(line[0]);int y=Integer.parseInt(line[1]);if(x>Max_x){Max_x=x;}if(y>Max_y){Max_y=y;}points[i]=new Point(x,y);}String[] line=reader.readLine().split(" ");Point A=new Point(Integer.parseInt(line[0]),Integer.parseInt(line[1]));line=reader.readLine().split(" ");Point B=new Point(Integer.parseInt(line[0]),Integer.parseInt(line[1]));System.out.println(process(points,A));System.out.println(process(points,B));reader.close();}static String process(Point[] points,Point C){String result="out";int m=0;Point D=new Point(Max_x+97,Max_y+99);for (int i = 0; i < points.length-1; i++) {Point A=points[i];Point B=points[i+1];if(cross_check(A,B,C,D)==1){m++;}}Point A=points[0];Point B=points[points.length-1];if(cross_check(A,B,C,D)==1){m++;}if(m%2==1){//奇数,点在里面result="in";}return result;}static int cross_check(Point A,Point B,Point C,Point D){int abc=direction(A,B,C);int abd=direction(A,B,D);int cda=direction(C,D,A);int cdb=direction(C,D,B);if(abc*abd <=0 && cda*cdb<=0){//System.out.printf("ABCD相交 %d,%d->%d,%d %d,%d->%d,%d \n",A.x,A.y,B.x,B.y,C.x,C.y,D.x,D.y);return 1;}else{//System.out.printf("ABCD不相交 %d,%d->%d,%d %d,%d->%d,%d \n",A.x,A.y,B.x,B.y,C.x,C.y,D.x,D.y);return 0;}}public static int direction(Point A,Point B,Point C){int dxAB=B.x-A.x;int dyAB=B.y-A.y;int dxAC=C.x-A.x;int dyAC=C.y-A.y;int abc=BigInteger.valueOf(dxAB).multiply(BigInteger.valueOf(dyAC)).compareTo(BigInteger.valueOf(dyAB).multiply(BigInteger.valueOf(dxAC)));if(abc>0){return -1;//顺时针}else if(abc<0){return 1;//逆时针}else{if(A.x==B.x && A.y==B.y){return 0;//A和B在一个点上}if(BigInteger.valueOf(dxAB).multiply(BigInteger.valueOf(dxAC)).compareTo(BigInteger.ZERO)<0 ||BigInteger.valueOf(dyAB).multiply(BigInteger.valueOf(dyAC)).compareTo(BigInteger.ZERO)<0){return -1;//A在BC的中间,也就是AB和AC刚好接在一起}else if(BigInteger.valueOf(dxAB).multiply(BigInteger.valueOf(dxAB)).add(BigInteger.valueOf(dyAB).multiply(BigInteger.valueOf(dyAB))).compareTo(BigInteger.valueOf(dxAC).multiply(BigInteger.valueOf(dxAC)).add(BigInteger.valueOf(dyAC).multiply(BigInteger.valueOf(dyAC))))>=0){//C在AB的中间return 0;}else {return -1;}}}static class Point{int x;int y;public Point(int parseInt, int parseInt1) {this.x=parseInt;this.y=parseInt1;}}
}

别人AC的代码,没看懂,mark一下

#include <cstdio>
#include <vector>
#define maxfunc(a,b)(a>b?a:b)
#define minfunc(a,b)(a<b?a:b)using namespace std;typedef struct point{long x, y;
}Point;typedef struct poligon{int ptNums;Point *ptlst;
}Poligon;
int n,cas;
int main(){vector<Point> vpt;vpt.reserve(100001);scanf("%d", &n);for (int i = 0; i < n; i++){Point p;scanf("%ld%ld", &p.x, &p.y);vpt.push_back(p);}Poligon pol;pol.ptNums = n;pol.ptlst = &vpt[0];Point testpt;cas = 0;while (scanf("%ld%ld", &testpt.x, &testpt.y) == 2){int cnt = 0;for (int i = 0; i < pol.ptNums; i++){long x1, x2, y1, y2;double tx, t;x1 = pol.ptlst->x, y1 = pol.ptlst->y;if (i == (n - 1)){// next point is first point(0) if current is n-1pol.ptlst -= (n - 1);}else pol.ptlst++; // go next point x2 = pol.ptlst->x, y2 = pol.ptlst->y;//tmp1 = maxfunc(y1, y2);if (testpt.y >= maxfunc(y1, y2) || testpt.y <= minfunc(y1, y2)) continue;t = (double)(testpt.y - y2) / (y1 - y2);// tx is the cross pointtx = (double)x2 - t*(x2 - x1);// only count the point at left of txif (testpt.x < tx) cnt++;}printf("%s\n", cnt % 2 == 0 ? "out" : "in");if(++cas>1) break;}return 0;
}

SW练习_点的位置_点线关系相关推荐

  1. 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

    前言:只照着常考题去刷题确实是一种方法.但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度.于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷.而是以面试出题频率 ...

  2. 腾讯视频下载位置_腾讯视频怎么下视频到手机

    很多人都使用腾讯视频,播放器家园网小编给大家分享一下腾讯视频下载位置_腾讯视频怎么下视频到手机相关内容.作为国内首家,全力打造正版视频平台的腾讯视频,将从流畅的观映体验.高清的视觉效果.贴心的分享感受 ...

  3. VBA小程序--针对所有已经打开的Excel文件_格式调整_针对所有工作表_冻结首行_无视所在位置

    VBA小程序--针对所有已经打开的Excel文件_格式调整_针对所有工作表_冻结首行_无视所在位置 Function 格式调整_针对所有工作表_冻结首行_无视所在位置()Dim sht As Work ...

  4. js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

    在 Design Tools 中,组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素.云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台,同样拥有自由拖拽的可视化 ...

  5. 2013福建高职单招计算机类专业,2013福建高职单招_计算机类专业_知识试题(卷).doc...

    2013福建高职单招_计算机类专业_知识试题(卷).doc (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .. 计算机类专业基 ...

  6. FVM in CFD 学习笔记_第11章_对流项离散

    学习自F. Moukalled, L. Mangani, M. Darwish所著The Finite Volume Method in Computational Fluid Dynamics - ...

  7. iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门

    iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...

  8. 黑*头条_第8章_爬虫系统搭建

    黑*头条_第8章_爬虫系统搭建 文章目录 黑*头条_第8章_爬虫系统搭建 目标 1爬虫是什么 2名词解释 2.1 Webmagic: 2.2 webmagic的总体架构: 2.3 webmagic的总 ...

  9. Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例

    Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 文章目录 Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 Seaborn 学习目标 6.1 Se ...

最新文章

  1. MySQL知识梳理与命令操作
  2. bat给文件追加换行内容
  3. 二层交换机、三层交换机和路由器的基本工作原理和三者之间的主要区别
  4. 驱动开发之 设备读写方式:缓冲区方式
  5. HashMap 与 ConcurrentHashMap
  6. mysql mycat 路由规则_Mycat水平拆分之十种分片规则
  7. Java基础学习总结(169)——ThreadLocal 使用总结
  8. 若依如何降低mysql驱动版本?
  9. 【编译原理笔记02】计算机如何表示语言及其文法,字母表(及其运算)、串、推导和归约、句型和句子、文法分析树
  10. gcms基峰有什么用_金鉴实验室 | 气相质谱(GCMS)
  11. [凯立德]2013年12月凯立德2013秋季版2F21J0E发布_我是亲民_新浪博客
  12. springboot社区快递代取服务系统毕业设计源码051434
  13. 小区物业专属公众号管理办法
  14. 使用lupdate生成Qt的ts翻译文件
  15. 解决vmware下虚拟机关机重启ip改变
  16. AIGC在营销图片生成技术综述
  17. opencv+对图片实现聚光灯效果
  18. JavaScript 经典代码大全
  19. 虚拟计算机组装的软件,如何使用虚拟光驱安装软件
  20. PMAC应用五-运动学

热门文章

  1. 一个输入框背景色改不了?去除浏览器自动填充的背景颜色
  2. c语言用K-T条件姐约束最优化方法,约束最优化方法
  3. 什么是染色质免疫沉淀法 (ChIP) ?——ChIP原理概述
  4. WCF-WCF的创建以及IIS服务
  5. Mongodb整合Spring示例
  6. 中国十大“勾魂”美景-戈壁滩、风蚀地貌
  7. html5游戏《命令与征服》
  8. Android手机开关机、重启时间优化
  9. java 接口超时控制_Java接口请求响应超时的解决办法
  10. 单片机c语言99秒倒计时,51单片机99秒倒计时C语言源程序