题目大意:
依次给定多个点(要求第一个点和最后一个点重叠),把前后两个点相连求最后得到的图形的面的个数

根据欧拉定理:

设平面图的顶点数为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 一笔画的更多相关文章

  1. nyoj-一笔画问题-欧拉图+联通判定

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  2. fcitx 候选词出现奇怪的笔画

    原来fcitx还有笔画输入的功能,输入h出现一个横,s出现竖,p是撇,n是捺,z是折. 虽然很有意思,但是不实用,而且还会出现在第一页候选词中,影响输入,可以通过配置文件禁用掉: $ vim ~/.c ...

  3. NYOJ 42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  4. ACM题目————一笔画问题

    描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N< ...

  5. nyoj-----42一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  6. UVA 291 The House Of Santa Claus (DFS求一笔画)

    题意:从左下方1开始,一笔画出圣诞老人的屋子(不过话说,圣诞老人的屋子是这样的吗?这算是个屋子么),输出所有可以的路径. 思路:贴代码. #include <iostream> #incl ...

  7. nyist 42 一笔画 (欧拉回路 + 并查集)

    nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...

  8. Nyoj42 一笔画问题 (欧拉道路)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...

  9. sql server 利用首字母拼音排序和笔画排序的语句

    --按笔画排序 select * from Student order by Sname COLLATE Chinese_PRC_Stroke_CS_AS_KS_WS --按字母拼音排序 select ...

随机推荐

  1. 第二个Struts2程序 应用动态Action

    1.创建web项目,添加struts2支持的类库,在web.xml中配置struts2过滤器. 2.创建名为UserAction的Action对象,并分别在其中编写add()和update()方法,用 ...

  2. 转】用Nodejs连接MySQL

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...

  3. Android基础夯实--重温动画(三)之初识Property Animation

    每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...

  4. 使用Kotlin,抛弃findViewById

    有没有觉得Android的findViewById挺烦人的.使用Kotlin可以让你彻底抛弃这个烦恼 步骤1.在build.gradle(Module:app)中添加如下一句话 这个在老一点版本的An ...

  5. 机器学习-Probabilistic interpretation

    Probabilistic interpretation,概率解释  解释为何线性回归的损失函数会选择最小二乘 表示误差,表示unmodeled因素或随机噪声,真实的y和预测出来的值之间是会有误差的, ...

  6. 新浪qq登录

    一:到腾讯QQ互联上申请APPID和APPKEY.申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY.新浪微博的申请同理 二:在Th ...

  7. iOS Programming Introduction to Auto Layout 自动布局

    iOS Programming Introduction to Auto Layout   自动布局 A single application that runs natively on both t ...

  8. sql发送邮件- html 格式

    ALTER PROCEDURE dbo.sx_pro_AutoEmailContent AS Begin declare @Rqty int declare @n int declare @m_rec ...

  9. ubuntu服务器建立apache虚拟主机

    启用与停用站点的方法 a2ensite 站点名 a2dissite 站点名 基于名字的(通过域名来区分)的虚拟主机 安装好apache以后默认有一个叫default的虚拟主机.新建虚拟主机时可以直接复 ...

  10. MySQL基础、索引、查询优化等考察点

    MySQL基础 MySQL数据类型 整数类型 TINYINT. SMALLINT. MEDIUMINT. INT. BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,例如:INT(1 ...