POJ 1118 && HDU 1432 Lining Up(计算几何)
2015-08-23 14:45
411 查看
Description
给你n个点,求最多有多少点共线
Input
多组输入,每组用例第一行为点数n(n<700),接下来n行为每个点的坐标x,y,以n=0结束输入
Output
对每组用例,输出共线点数最大值
Sample Input
5
1 1
2 2
3 3
9 10
10 11
0
Sample Output
3
Solution
暴力枚举两点,求出两点之后有多少点与这两点共线,更新最大值即可,其中当共线点数已经大于总点数一半时结束枚举,这是一步重要的剪枝
Code
给你n个点,求最多有多少点共线
Input
多组输入,每组用例第一行为点数n(n<700),接下来n行为每个点的坐标x,y,以n=0结束输入
Output
对每组用例,输出共线点数最大值
Sample Input
5
1 1
2 2
3 3
9 10
10 11
0
Sample Output
3
Solution
暴力枚举两点,求出两点之后有多少点与这两点共线,更新最大值即可,其中当共线点数已经大于总点数一半时结束枚举,这是一步重要的剪枝
Code
#include<stdio.h> #define X(x1,y1,x2,y2,x3,y3) ((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))//判断三点是否共线 #define max(x,y) x>y?x:y int main() { int n,i,j,k,z[701][2],count,max=0,flag1,flag2; scanf("%d",&n); while(n!=0) { flag1=n/2; flag2=0;//标志变量 max=0; for(i=0;i<n;i++) scanf("%d%d",&z[i][0],&z[i][1]); for(i=0;!flag2&&i<n;i++)//暴搜 for(j=i+1;!flag2&&j<n;j++) { count=2; for(k=j+1;k<n;k++) if((!X(z[i][0],z[i][1],z[j][0],z[j][1],z[k][0],z[k][1]))&&(!X(z[j][0],z[j][1],z[k][0],z[k][1],z[i][0],z[i][1])))//判断三点是否共线 count++; if(count>flag1)//若共线点数已经超过所有点的一半则不用继续搜索了 { printf("%d\n",count); flag2=1; } max=max(max,count);//更新最多共线点数 } if(!flag2) printf("%d\n",max); scanf("%d",&n); } return 0; }
相关文章推荐
- 模运算的规则
- lightoj 1044 Palindrome Partitioning(dp)
- 【Material Design视觉设计语言】Material Design设计概述
- Spring JdbcTemplate batchUpdate() example
- 使用DBCP进行数据源配置
- UIControl
- 机器学习与人工智能学习资源导引(转自刘未鹏)
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
- 华为OJ(按字节截取字符串)
- linux shell中的管道执行(作业控制有关的shell)
- leetCode 116.Populating Next Right Pointers in Each Node (为节点填充右指针) 解题思路和方法
- 预编译相关详解
- org.apache.jasper.JasperException: Unable to compile class for JSP.JSP文件过大,导致文件编译出错
- Linux设备驱动开发——环境搭建
- 正则之邮箱,QQ,网址的写法
- Spring JdbcTemplate Querying examples
- oracle学习笔记——存储过程
- 数据结构之队列的顺序实现
- MinHashing基本原理
- java学习个人笔记---Java内存管理之java对象内存中的状态