nyoj 83-迷宫寻宝(二) (计算几何, 叉积)
83-迷宫寻宝(二)
内存限制:10MB
时间限制:1000ms
特判: No
通过数:2
提交数:6
难度:5
题目描述:

墙把迷宫分隔成很多藏宝室,任何两个藏宝室之间都没有门。
ACM现在准备用开凿设备在相邻两个藏宝室的墙中间凿开一个门,最终取出迷宫中的宝物。
但是,开凿门是一件很费力费时的工作,ACM想开凿尽量少的门取出宝物,现在请你写一个程序来帮助它判断一下最少需要开几个门吧。
输入描述:
第一行输入一个正数N(N<10)表示测试数据组数
每组测试数据的第一行是一个整数n(0<=n<=30),代表了墙的个数,随后的n行里每行有四个整数x1,x2,y1,y2,这四个数分别是代表一个墙的两个端点的坐标。外围的正方形四个顶点固定在(0,0)(0,100)(100,0)(100,100)这四堵个墙不在上面的n个数里。注意,不能在两个线的交点处开凿门。
数据保证任意两个中间墙的交点不在四周的墙上。
输完所有的墙后,输入两个数,x,y(可能不是整数),表示宝藏的坐标。
输出描述:
输出最少需要开凿的门的个数
样例输入:
1
7
20 0 37 100
40 0 76 100
85 0 0 75
100 90 0 90
0 71 100 61
0 14 100 38
100 47 47 100
54.5 55.4
样例输出:
2 分析:
1、我们可以通过叉积来判断线段是否相交
PS:
node A, B;
struct line
{
node a, b;
}L[];
int cross_product(node A, node B, node C)
{
return ((A.x - B.x) * (A.y - C.y) - (A.y - B.y) * (A.x - B.x));
}
if (cross_product(A, L[i].a, L[i].b) * cross_product(B, L[i].a, L[i].b) < -EPS) // 判断是否相交
{
++ cnt;
}
2、遍历所有的点,即就可以得到最短的组合
C/C++代码实现(AC):
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set>
#include <climits> using namespace std;
const int MAXN = ;
const int MY_MAX = INT_MAX;
const int EPS = 1e-;
int N, n; struct node
{
double x, y;
}; struct line
{
node a, b;
}l[MAXN]; int cross_product(node A, node B, node C)
{
return ((B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x));
} int solve(node K, node A)
{
int cnt = ;
for(int i = ; i < n; ++ i)
{
if (cross_product(A, l[i].a, l[i].b) * cross_product(K, l[i].a, l[i].b) < -EPS)
++ cnt;
}
return cnt;
} int main()
{
scanf("%d", &N);
while(N --)
{
int cnt = MY_MAX;
scanf("%d", &n);
for(int i = ; i < n; ++ i)
scanf("%lf%lf%lf%lf", &l[i].a.x, &l[i].a.y, &l[i].b.x, &l[i].b.y);
node k;
scanf("%lf%lf", &k.x, &k.y);
if (n == )
printf("1\n");
else
{
for(int i = ; i < n; ++ i)
{
cnt = min(cnt, solve(k, l[i].a));
cnt = min(cnt, solve(k, l[i].b));
}
printf("%d\n", cnt);
}
}
return ;
}
nyoj 83-迷宫寻宝(二) (计算几何, 叉积)的更多相关文章
- nyoj 83:迷宫寻宝(二)(计算几何)
题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...
- nyoj 82 迷宫寻宝(一)
点击打开链接 迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...
- nyoj 82 迷宫寻宝(二)
http://acm.nyist.net/JudgeOnline/problem.php?pid=83 题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一 ...
- Unity3D实现立体迷宫寻宝
Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...
- 迷宫寻宝(一)(bfs)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...
- Problem 2285 迷宫寻宝 (BFS)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323 Submit: 1247Time Li ...
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
Problem B 迷宫寻宝 Accept: 52 Submit: 183Time Limit: 1000 mSec Memory Limit : 32768 KB Problem De ...
- NYOJ82 迷宫寻宝(一)【BFS】
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 一个叫ACM的寻宝者找到了一个藏宝图.它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个 ...
- nyoj_83:迷宫寻宝(二)(计算几何)
题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...
随机推荐
- [NOIp2013] luogu P1966 火柴排队
磕了瓶魔爪. 题目描述 你有两个长度为 NNN 的数组 a,ba,ba,b,试重新排列 aaa 数组使得S=∑i=1n(ai−bi)2S=\sum_{i=1}^{n}{(a_i-b_i)^2}S=i= ...
- boost::thread_specific_ptr
thread_specific_ptr代表了一个全局的变量,而在每个线程中都各自new一个线程本地的对象交给它进行管理. 线程之间就不会因为访问同一全局对象而引起资源竞争导致性能下降. 而线程结束时, ...
- webpack 打包 todolist 应用
写在前面的话: 一直想着手动配置webpack实现应用,正好最近这段时间比较空闲,就写了一个通过webpack打包实现todolist的简单应用.本文内容包括:通过webpack打包css,html ...
- Myeclipse 反编译工具插件
JadClipse是java的反编译工具,是命令行执行,反编译出来的源文件可读性较高.可惜用起来不太方便.还好 找到myeclipse下的插件,叫JadClipse,安装好之后,只要双击.class文 ...
- CSS(1)---css语法、css选择器
CSS(1)---css语法.css选择器 一.CSS语法 1.CSS语法 CSS 规则由两个主要的部分构成:选择器以及一条或多条声明. 属性 是您希望设置的 样式属性.每个属性有一个属性值.属性和属 ...
- redis集群之Codis
在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...
- 手写一个简单的ElasticSearch SQL转换器(一)
一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...
- NetworkManager网络通讯_NetworkManager(二)
本文主要来实现一下自定UI(实现HUD的功能),并对Network Manger进行深入的讲解. 1)自定义manager 创建脚本CustomerUnetManger,并继承自NetworkMang ...
- Vue学习系列(四)——理解生命周期和钩子
前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过 ...
- Dubbo 优雅停机演进之路
一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...