nyoj 82 迷宫寻宝(二)
http://acm.nyist.net/JudgeOnline/problem.php?pid=83
题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一个线段, 求出所有线段和墙相交的最少次数就是结果
#include<stdio.h>
struct point
{
double x, y;
};
struct line
{
point a, b;
};
double det(double x1, double y1, double x2, double y2)//计算叉积
{
return x1 * y2 - x2 * y1;
}
double get_dir(point a, point b, point c)//计算向量ac 在向量ab的哪个方向(正数为逆时针,负数为顺时针, 零为同向或者反向)
{
return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}
int check_cross(line a, line b)//计算出两条线段是否相交,注意只有确定两条线段的都在对方的两侧,才能确定这两条线段相交
{
double flag1 = get_dir(a.a, a.b, b.a) * get_dir(a.a, a.b, b.b);
int f1 = flag1 > 0 ? 1 : -1;
double flag2 = get_dir(b.a, b.b, a.a) * get_dir(b.a, b.b, a.b);
int f2 = flag2 > 0? 1 : -1;
if(f1 < 0 && f2 < 0)
return -1;
else
return 1;
}
line lines[40];
int axis1[101], axis2[101], axis3[101], axis4[101];
int get_cross_number(point start, point end, int total)//计算相交次数
{
line templine;
templine.a = start;
templine.b = end;
int count = 0;
int i;
for(i = 0; i < total; i++)
{
if(check_cross(templine, lines[i]) - 0 < 1e-6)
count ++;
}
return count;
}
int main()
{
int n;
scanf("%d", &n);
while(n--)
{ int m;
int top1, top2, top3, top4;
top1 = top2 = top3 = top4 = 0;
scanf("%d", &m);
int i;
for(i = 0; i < m; i++)
{
int x1, x2, y1, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
lines[i].a.x = x1;
lines[i].a.y = y1;
lines[i].b.x = x2;
lines[i].b.y = y2;
}
point end;
scanf("%lf %lf", &end.x, &end.y);
int min = 0x7fffffff;
for(i = 0; i < 101; i++)
{
if(min == 0)
break;
point start;
int res;
start.x = 0;
start.y = i;
res = get_cross_number(start, end, m);
if(res < min)
min = res;
start.x = 100;
start.y = i;
res = get_cross_number(start, end, m);
if(res < min)
min = res;
start.x = i;
start.y = 0;
res = get_cross_number(start, end, m);
if(res < min)
min = res;
start.x = i;
start.y = 100;
res = get_cross_number(start, end, m);
if(res < min)
min = res;
}
printf("%d\n", min + 1);
}
return 0;
}
nyoj 82 迷宫寻宝(二)的更多相关文章
- nyoj 82 迷宫寻宝(一)
点击打开链接 迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...
- nyoj 83:迷宫寻宝(二)(计算几何)
题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...
- nyist 82迷宫寻宝(一)(BFS)
题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...
- 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-迷宫寻宝(二) (计算几何, 叉积)
83-迷宫寻宝(二) 内存限制:10MB 时间限制:1000ms 特判: No 通过数:2 提交数:6 难度:5 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...
随机推荐
- 优化 UltraEdit 打开大文件时的性能
UltraEdit 原本就是被设计成可以打开超大文件的工具,只不过在默认情况下需要进行以下优化设置: 禁止临时文件 禁止显示行号 禁止文件(回车 & 换行符)转换 禁止代码折叠 禁止显示函数列 ...
- downsampling and upsampling【转】
orig: http://www.eetimes.com/document.asp?doc_id=1275556 downsampling The process of reducing a samp ...
- 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...
- 4.Rabbits and Recurrence Relations
Problem A sequence is an ordered collection of objects (usually numbers), which are allowed to repea ...
- html基础二
空标签 <br>用于分行 <hr>在 HTML 页面中创建水平线 “ctrl+/”用于在代码输入时注释 注释掉的内容将不会在浏览器上显示 这样方便在代码输入提高可读性 方便 ...
- Python实例1
1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 错解: 正解: 源码: #!/usr/bin/python for i in range(1,5): for j in ...
- jsp页面动态显示时间
<SCRIPT language="JavaScript"> function disptime(){ var time = new Date(); var hour ...
- HDU 5964 平行四边形
假设直线L和L'相交于原点O.假设S ={s1,s2,...,sn}是平面上的n个点.你打 算找四个点满足如下条件:1. A ∈ L 而 A' ∈ L'.2. B,B'都属于S;即 B∈S 且 ...
- [课程设计]Scrum 1.4 多鱼点餐系统开发进度
Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...
- WebAPI学习点滴(一)
对于GET请求,如果方法名不是以Get开头,就必须加上[HttpGet]标签,不然无法找到该方法,如果是以Get开头则没有这个问题. 因此,推荐所有方法都确定访问方式,加上标签. [HttpGet] ...