LA3263 一笔画
题目大意:
依次给定多个点(要求第一个点和最后一个点重叠),把前后两个点相连求最后得到的图形的面的个数
根据欧拉定理:
设平面图的顶点数为V,边数为E,面数为F,则V+F-E = 2
这里的E是指如果一条直线上被多个点分割,那么就算多条边
所以我们要求出V和E的值
先求点,已给定的点数,还要包括相连过程中相交得到的点,经过去重得到最后的点数
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
//if(i==j) continue;
if(onIntersection(po[i],po[i+1],po[j],po[j+1])){
vp.push_back(getLineIntersection(po[i],po[i+1]-po[i],po[j],po[j+1]-po[j]));
}
}
}
sort(vp.begin(),vp.end());
c=unique(vp.begin(),vp.end()) - vp.begin(); //去重前要先进行排序,unique是对地址进行操作,所以这里使用数组也可以
然后找边,根据是否有新得到的点出现在边上,若有,每次边数++;
for(int i=0;i<c;i++){
for(int j=0;j<n;j++){
if(onSegment(vp[i],po[j],po[j+1]))
e++;
}
}
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-10
struct Point {
double x,y;
Point(double x=,double y=):x(x),y(y){}
}po[];
typedef Point Vector; vector<Point> vp; int dcmp(double x)
{
if(abs(x)<eps) return ;
return x>?:-;
} bool operator==(const Point &a,const Point &b){
return dcmp(a.x-b.x) == && dcmp(a.y-b.y) == ;
} Vector operator-(Point a,Point b){
return Vector(a.x-b.x,a.y-b.y);
} Vector operator+(Vector a,Vector b){
return Vector(a.x+b.x,a.y+b.y);
} Vector operator*(Vector a,double b){
return Vector(a.x*b,a.y*b);
} Vector operator/(Vector a,double b){
return Vector(a.x/b,a.y/b);
} bool operator<(const Point &a,const Point &b){
return a.x<b.x||(a.x==b.x&&a.y<b.y);
} double Dot(Vector a,Vector b){
return a.x*b.x + a.y*b.y;
} double Cross(Vector a,Vector b){
return a.x*b.y - a.y*b.x;
} double Length(Vector a){
return sqrt(Dot(a,a));
} double Angle(Vector a,Vector b){
return acos(Dot(a,b) / Length(a) / Length(b));
} Point getLineIntersection(Point a,Vector va , Point b , Vector vb){
Vector c = a-b;
double t = Cross(vb,c) / Cross(va,vb);
return a+va*t;
} bool onSegment(Point a,Point st,Point la){
return dcmp(Cross(st-a,la-a)) == && dcmp(Dot(st-a,la-a)) < ;
} bool onIntersection(Point a , Point b , Point c , Point d){
double t1 = dcmp(Cross(b-a , c-a)) , t2 = dcmp(Cross(b-a , d-a));
double t3 = dcmp(Cross(d-c , b-c)) , t4 = dcmp(Cross(d-c , a-c));
return t1*t2 < && t3*t4<;
} int main()
{
// freopen("test.in","rb",stdin);
int kase = ;
int n,x,y,e,c;
while(~scanf("%d",&n)){
if(n==) break; vp.clear();
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
po[i].x = x,po[i].y = y;
vp.push_back(po[i]);
}
n--;
e=n;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
//if(i==j) continue;
if(onIntersection(po[i],po[i+],po[j],po[j+])){
vp.push_back(getLineIntersection(po[i],po[i+]-po[i],po[j],po[j+]-po[j]));
}
}
}
sort(vp.begin(),vp.end());
c=unique(vp.begin(),vp.end()) - vp.begin();
for(int i=;i<c;i++){
for(int j=;j<n;j++){
if(onSegment(vp[i],po[j],po[j+]))
e++;
}
}
printf("Case %d: There are %d pieces.\n",++kase,e-c+);
}
return ;
}
LA3263 一笔画的更多相关文章
- nyoj-一笔画问题-欧拉图+联通判定
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- fcitx 候选词出现奇怪的笔画
原来fcitx还有笔画输入的功能,输入h出现一个横,s出现竖,p是撇,n是捺,z是折. 虽然很有意思,但是不实用,而且还会出现在第一页候选词中,影响输入,可以通过配置文件禁用掉: $ vim ~/.c ...
- NYOJ 42 一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- ACM题目————一笔画问题
描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N< ...
- nyoj-----42一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- UVA 291 The House Of Santa Claus (DFS求一笔画)
题意:从左下方1开始,一笔画出圣诞老人的屋子(不过话说,圣诞老人的屋子是这样的吗?这算是个屋子么),输出所有可以的路径. 思路:贴代码. #include <iostream> #incl ...
- nyist 42 一笔画 (欧拉回路 + 并查集)
nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...
- Nyoj42 一笔画问题 (欧拉道路)
http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...
- sql server 利用首字母拼音排序和笔画排序的语句
--按笔画排序 select * from Student order by Sname COLLATE Chinese_PRC_Stroke_CS_AS_KS_WS --按字母拼音排序 select ...
随机推荐
- 第二个Struts2程序 应用动态Action
1.创建web项目,添加struts2支持的类库,在web.xml中配置struts2过滤器. 2.创建名为UserAction的Action对象,并分别在其中编写add()和update()方法,用 ...
- 转】用Nodejs连接MySQL
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...
- Android基础夯实--重温动画(三)之初识Property Animation
每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...
- 使用Kotlin,抛弃findViewById
有没有觉得Android的findViewById挺烦人的.使用Kotlin可以让你彻底抛弃这个烦恼 步骤1.在build.gradle(Module:app)中添加如下一句话 这个在老一点版本的An ...
- 机器学习-Probabilistic interpretation
Probabilistic interpretation,概率解释 解释为何线性回归的损失函数会选择最小二乘 表示误差,表示unmodeled因素或随机噪声,真实的y和预测出来的值之间是会有误差的, ...
- 新浪qq登录
一:到腾讯QQ互联上申请APPID和APPKEY.申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY.新浪微博的申请同理 二:在Th ...
- iOS Programming Introduction to Auto Layout 自动布局
iOS Programming Introduction to Auto Layout 自动布局 A single application that runs natively on both t ...
- sql发送邮件- html 格式
ALTER PROCEDURE dbo.sx_pro_AutoEmailContent AS Begin declare @Rqty int declare @n int declare @m_rec ...
- ubuntu服务器建立apache虚拟主机
启用与停用站点的方法 a2ensite 站点名 a2dissite 站点名 基于名字的(通过域名来区分)的虚拟主机 安装好apache以后默认有一个叫default的虚拟主机.新建虚拟主机时可以直接复 ...
- MySQL基础、索引、查询优化等考察点
MySQL基础 MySQL数据类型 整数类型 TINYINT. SMALLINT. MEDIUMINT. INT. BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,例如:INT(1 ...