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 ...
随机推荐
- Vue 全家桶,深入Vue 的世界
内容简介: Vue 实例上的属性 Vue 生命周期 Vue 数据绑定 computed 计算属性 watch 监听器 Vue 组件 Vue 组件 extend Vue 组件高级属性 Vue 的rend ...
- [JOYOI1307] 联络员
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvj网站的逐 ...
- boost::multi_index 多索引容器
#include "stdafx.h" #include <string> #include <boost/multi_index_container.hpp&g ...
- Drive Scope Mac硬盘检查分析神器
Drive Scope Mac硬盘检查分析神器 硬盘驱动器(和固态驱动器)是Mac中最容易出故障的组件.出于这个原因,事实上,驱动器制造商已将自我监控,分析和报告技术内置于驱动器中.(又名SMART) ...
- Leetcode(4)寻找两个有序数组的中位数
Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...
- Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)
刚开始使用Mybaits的同学有没有这样的疑惑,为什么我们没有编写Mapper的实现类,却能调用Mapper的方法呢?本篇文章我带大家一起来解决这个疑问 上一篇文章我们获取到了DefaultSqlSe ...
- WWW网络请求
采用WWW获取网络数据: (一)get 1)天气数据下载 private string weatherApi = "http://www.sojson.com/open/api/weathe ...
- django-模型之(ORM)对象关系映射(一)
所谓对象关系映射,就是将数据库的一些名字与python中的一些名字相对应,表名-->类名,字段-->属性,操作(增删改查)-->方法.这样,我们就可以通过对Python代码的编辑来对 ...
- Vue学习系列(四)——理解生命周期和钩子
前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过 ...
- spring cloud Ribbon的使用和实现原理
转载链接:https://blog.csdn.net/qq_20597727/article/details/82860521 简介 这篇文章主要介绍一下ribbon在程序中的基本使用,在这里是单独拿 ...