背景

hzy是箱子迷,他很喜欢摆放箱子,这次他邀请zdq,skoier一起来玩game...

描述

地板上有一个正方形的大箱子和许多三角型的小箱子。所有的小箱子都在大箱子里面,同时,一些三角形的小箱子可能在另一些小箱子里面,但是所有的小箱子都不相交。你在大箱子里面随机选一个点,它恰好在inBox个小箱子里的概率是多少?我们知道,大箱子的边都平行于坐标轴,并且有两个顶点位于(0,0)和(100,100)。

格式

输入格式

输入的第一行包含两个正整数n和inBox(0 <= inBox <= n <=50),表示小箱子的个数以及随机点在多少个小箱子里面。接下来n行每行包含6个整数x1,y1,x2,y2,x3,y3,表示一个小箱子的三个顶点的坐标。

输出格式

输出仅包含一个数字,表示你计算的概率,精确到小数点后5位。

样例输入1[复制]

2 1
0 0 20 0 0 10
1 1 6 1 1 5

样例输出1[复制]

 
0.00900

样例输入2[复制]

4 0
0 0 10 0 0 20
0 100 0 90 20 100
50 50 60 60 50 70
51 55 55 60 51 65

样例输出2[复制]

 
0.97000

题意:给出很多三角形,问某个点存在于k个三角形内部的概率为多少

思路:叉积判断两个三角形是否为内含关系,并可以拿来求三角形面积,从三角形面积大到小和是否为内含关系来建一颗树,最后DFS求出k层三角形的面积-k+1层三角形的面积,最后除以总面积即可。

/** @Date    : 2016-12-12-21.02
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version :
*/
#include<bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-6; typedef struct str
{
double x, y;
}pot; struct trg
{
str p1, p2, p3;
}; struct node
{
trg tri;
vector son;
int h;
}; double cross(str &a, str &b)
{
return a.x*b.y - a.y*b.x;
} str creatstr(str &a, str &b)
{
str x;
x.x = a.x - b.x;
x.y = a.y - b.y;
return x;
} int isin(trg &a, trg &b)
{
str s1 = creatstr(b.p1, a.p1);
str s2 = creatstr(b.p1, a.p2);
str s3 = creatstr(b.p1, a.p3);
double r1 = cross(s1, s2);
double r2 = cross(s2, s3);
double r3 = cross(s3, s1);
double ep1 = fabs(r1);
double ep2 = fabs(r2);
double ep3 = fabs(r3);
if( ((r1 > 0 && r2 > 0 && r3 > 0 )||(r1 < 0 && r2 < 0 && r3 < 0 )||(ep1 < eps || ep2 < eps || ep3 < eps)) != 1)
return 0; s1 = creatstr(b.p2, a.p1);
s2 = creatstr(b.p2, a.p2);
s3 = creatstr(b.p2, a.p3);
r1 = cross(s1, s2);
r2 = cross(s2, s3);
r3 = cross(s3, s1);
ep1 = fabs(r1);
ep2 = fabs(r2);
ep3 = fabs(r3);
if( ((r1 > 0 && r2 > 0 && r3 > 0 )||(r1 < 0 && r2 < 0 && r3 < 0 )||(ep1 < eps || ep2 < eps || ep3 < eps)) != 1)
return 0; s1 = creatstr(b.p3, a.p1);
s2 = creatstr(b.p3, a.p2);
s3 = creatstr(b.p3, a.p3);
r1 = cross(s1, s2);
r2 = cross(s2, s3);
r3 = cross(s3, s1);
ep1 = fabs(r1);
ep2 = fabs(r2);
ep3 = fabs(r3);
if( ((r1 > 0 && r2 > 0 && r3 > 0 )||(r1 < 0 && r2 < 0 && r3 < 0 )||(ep1 < eps || ep2 < eps || ep3 < eps)) != 1)
return 0; else return 1;
} double calarea(trg &a)
{
str s1 = creatstr(a.p1, a.p2);
str s2 = creatstr(a.p2, a.p3);
double siz = fabs(cross(s1 , s2)) / 2.00000;
return siz;
} node* insertT(node *h, trg &a)
{
node *t;
if(h == NULL)//到叶子时返回
{
t = new node;
t->tri = a;
t->h = 0;
return t;
}
for(int i = 0; i < h->son.size(); i++)
{
t = h->son[i];
if(isin(t->tri, a))
{
h->son[i] = insertT(t, a); //递归建树
h->son[i]->h = h->h + 1;
return h;
}
}
int p = h->son.size();
h->son.PB(insertT(NULL, a));
h->son[p]->h = h->h + 1;
return h;
} double dfs(node *h, int k)
{
if (h == NULL)
return 0; if (h->h < k)
{
double sum = 0;
for (int i = 0; i < h->son.size(); i++)
sum += dfs(h->son[i], k);
return sum;
}
else
{
double ins = 0;
for (int i = 0; i < h->son.size(); i++)
ins += calarea(h->son[i]->tri);
return calarea(h->tri) - ins;
}
} int cmp(trg a, trg b)
{
return calarea(a) > calarea(b);
} int main()
{
trg tri[1010];
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++)
{
double a, b, c, d, e, f;
scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e, &f);
tri[i].p1.x = a;
tri[i].p1.y = b;
tri[i].p2.x = c;
tri[i].p2.y = d;
tri[i].p3.x = e;
tri[i].p3.y = f;
}
sort(tri + 1, tri + 1 + n, cmp);
tri[0].p1.x = -1000;
tri[0].p1.y = -1000;
tri[0].p2.x = 1000;
tri[0].p2.y = -1000;
tri[0].p3.x = 1000;
tri[0].p3.y = 2000;
node *head = NULL;
head = insertT(head, tri[0]); for(int i = 1; i <= n; i++)
{
head = insertT(head, tri[i]); }
double ans = 0;
if(k == 0)
{
double t = 0;
for(int i = 0; i < head->son.size(); i++)
{
t += calarea(head->son[i]->tri);
}
ans = 10000 - t;
}
else ans = dfs(head, k); ans /= 10000.000;
printf("%.5lf\n", ans);
return 0;
}

vijos 1288 箱子游戏 计算几何的更多相关文章

  1. Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏

    一.预备知识—对象的”生“与”死“ (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive() 以上一篇的博文中的“指 ...

  2. JavaScript写一个小乌龟推箱子游戏

    推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...

  3. 用HTML5+原生js实现的推箱子游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. C# 推箱子游戏&对战游戏

    推箱子游戏提纲,只有向右向上的操作,向左向下同理,后期需完善. namespace 推箱子 { class Program { static void Main(string[] args) { // ...

  5. C++学习(九)(C语言部分)之 项目 推箱子游戏

    游戏制作 推箱子 步骤分析 1.模板 2.模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3.如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4. ...

  6. 【CCpp程序设计2017】推箱子游戏

    我的还……支持撤销!用链表实现! 题目:推箱子小游戏(基于console) 功能要求: 将p09迷宫游戏改造为“推箱子”游戏: 在地图中增加箱子.箱子目标位置等图形: 当玩家将所有箱子归位,则显示玩家 ...

  7. JavaScript 推箱子游戏

    推箱子游戏的 逻辑非常简单,但是如果不动手的话,还是不太清楚.我在这里讲一下自己的思路. 制作推箱子,首先要有自己的设计素材.如下我也是网上找的素材 第二步,理清游戏的规则. 游戏规则: 1.小人将箱 ...

  8. three.js 制作一个三维的推箱子游戏

    今天郭先生发现大家更喜欢看我发的three.js小作品,今天我就发一个3d版本推箱子的游戏,其实webGL有很多框架,three.js并不合适做游戏引擎,但是可以尝试一些小游戏.在线案例请点击博客原文 ...

  9. 用C写一个简单的推箱子游戏(二)

    下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...

随机推荐

  1. 20135208JAVA第二次试验

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352 姓名:贺邦  学号:20135208 成绩:             指导教师:娄嘉鹏  ...

  2. txt文件存储问题

    一.实际大小与占用空间不一致: 1.占用空间和磁盘有关,一般磁盘存储最小大小为4kb(4096字节). 2.当txt文件中仅有1个数字‘5’的时候,大小显示为1个字节(属性看,列表详细不精确),占用空 ...

  3. Python:文件操作总结1——文件基本操作

    一.文件的操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 二.文件的打开与关闭 A.文件的打开——open函数 语法:open(file[,mode[, ...

  4. IDEA + SSH OA 第一天(IDEA 文件夹类型了解)

    回顾一下 IDEA 的文件夹的类型 设置文件夹方法 或者点击右上角的 文件夹的类型选择:可通过,右键文件夹,选择你要的类型: Sources Root : 源码的目录 Resources Root:源 ...

  5. Alpha-7

    前言 失心疯病源7 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 18:30~20:30 通过统计法来得出人车团块的区别和鉴别方法,然而效果并不显著 代码签 ...

  6. CoordinatdBolt原理分析

    参考链接:http://xumingming.sinaapp.com/811/twitter-storm-code-analysis-coordinated-bolt/ CoordinatedBolt ...

  7. WebService(三)

    JAX-WS简单使用示例: 1.服务端 package com.rong.service; import javax.jws.WebMethod; import javax.jws.WebParam; ...

  8. 第91天:CSS3 属性选择器、伪类选择器和伪元素选择器

    一.属性选择器 其特点是通过属性来选择元素,具体有以下5种形式: 1.E[attr] 表示存在attr属性即可:    div[class] 2.E[attr=val] 表示属性值完全等于val:   ...

  9. 【uoj#225】[UR #15]奥林匹克五子棋 构造

    题目描述 两个人在 $n\times m$ 的棋盘上下 $k$ 子棋,问:是否存在一种平局的情况?如果存在则输出一种可能的最终情况. 输入 第一行三个正整数 $n,m,k$ ,意义如前所述. 输出 如 ...

  10. Python 3中的str和bytes类型

    Python3 中的str和bytes类型 Python3最重要的新特性之一是:对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Pyt ...