http://acm.nyist.net/JudgeOnline/problem.php?pid=83

题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一个线段, 求出所有线段和墙相交的最少次数就是结果

  1. #include<stdio.h>
  2. struct point
  3. {
  4. double x, y;
  5. };
  6. struct line
  7. {
  8. point a, b;
  9. };
  10. double det(double x1, double y1, double x2, double y2)//计算叉积
  11. {
  12. return x1 * y2 - x2 * y1;
  13. }
  14. double get_dir(point a, point b, point c)//计算向量ac 在向量ab的哪个方向(正数为逆时针,负数为顺时针, 零为同向或者反向)
  15. {
  16. return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
  17. }
  18. int check_cross(line a, line b)//计算出两条线段是否相交,注意只有确定两条线段的都在对方的两侧,才能确定这两条线段相交
  19. {
  20. double flag1 = get_dir(a.a, a.b, b.a) * get_dir(a.a, a.b, b.b);
  21. int f1 = flag1 > 0 ? 1 : -1;
  22. double flag2 = get_dir(b.a, b.b, a.a) * get_dir(b.a, b.b, a.b);
  23. int f2 = flag2 > 0? 1 : -1;
  24. if(f1 < 0 && f2 < 0)
  25. return -1;
  26. else
  27. return 1;
  28. }
  29. line lines[40];
  30. int axis1[101], axis2[101], axis3[101], axis4[101];
  31. int get_cross_number(point start, point end, int total)//计算相交次数
  32. {
  33. line templine;
  34. templine.a = start;
  35. templine.b = end;
  36. int count = 0;
  37. int i;
  38. for(i = 0; i < total; i++)
  39. {
  40. if(check_cross(templine, lines[i]) - 0 < 1e-6)
  41. count ++;
  42. }
  43. return count;
  44. }
  45. int main()
  46. {
  47. int n;
  48. scanf("%d", &n);
  49. while(n--)
  50. {
  51.  
  52. int m;
  53. int top1, top2, top3, top4;
  54. top1 = top2 = top3 = top4 = 0;
  55. scanf("%d", &m);
  56. int i;
  57. for(i = 0; i < m; i++)
  58. {
  59. int x1, x2, y1, y2;
  60. scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  61. lines[i].a.x = x1;
  62. lines[i].a.y = y1;
  63. lines[i].b.x = x2;
  64. lines[i].b.y = y2;
  65. }
  66. point end;
  67. scanf("%lf %lf", &end.x, &end.y);
  68. int min = 0x7fffffff;
  69. for(i = 0; i < 101; i++)
  70. {
  71. if(min == 0)
  72. break;
  73. point start;
  74. int res;
  75. start.x = 0;
  76. start.y = i;
  77. res = get_cross_number(start, end, m);
  78. if(res < min)
  79. min = res;
  80. start.x = 100;
  81. start.y = i;
  82. res = get_cross_number(start, end, m);
  83. if(res < min)
  84. min = res;
  85. start.x = i;
  86. start.y = 0;
  87. res = get_cross_number(start, end, m);
  88. if(res < min)
  89. min = res;
  90. start.x = i;
  91. start.y = 100;
  92. res = get_cross_number(start, end, m);
  93. if(res < min)
  94. min = res;
  95. }
  96. printf("%d\n", min + 1);
  97. }
  98. return 0;
  99. }

  

nyoj 82 迷宫寻宝(二)的更多相关文章

  1. nyoj 82 迷宫寻宝(一)

    点击打开链接 迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫 ...

  2. nyoj 83:迷宫寻宝(二)(计算几何)

    题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...

  3. nyist 82迷宫寻宝(一)(BFS)

    题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...

  4. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  5. 迷宫寻宝(一)(bfs)

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...

  6. Problem 2285 迷宫寻宝 (BFS)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323    Submit: 1247Time Li ...

  7. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝

    Problem B 迷宫寻宝 Accept: 52    Submit: 183Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem De ...

  8. NYOJ82 迷宫寻宝(一)【BFS】

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个叫ACM的寻宝者找到了一个藏宝图.它依据藏宝图找到了一个迷宫,这是一个非常特别的迷宫,迷宫里有N个 ...

  9. nyoj 83-迷宫寻宝(二) (计算几何, 叉积)

    83-迷宫寻宝(二) 内存限制:10MB 时间限制:1000ms 特判: No 通过数:2 提交数:6 难度:5 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...

随机推荐

  1. 批量过滤POST GET数据

    if(get_magic_quotes_gpc()){ $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); ...

  2. mysqldump-info

    其实很多东西都能在info里面找到非常详细的说明,只是,我们太忙了,只想要一个答案,而无心去看而已,所以呢,就把用得到的都看一下来记录吧. 命令模式:mysqldump [options] [db_n ...

  3. keras 入门之 regression

    本实验分三步: 1. 建立数据集 2. 建立网络并训练 3. 可视化 import numpy as np from keras.models import Sequential from keras ...

  4. 模块:jquery实现表格的隔行换色

    效果图: 知识点精讲:jquery中$("tr:odd")和$("tr:even")选择器分别代表奇数行和偶数行,并且索引是从0开始,即第一行为偶数: 代码实现 ...

  5. JQuery 阻止js事件冒泡 阻止浏览器默认操作

    //阻止事件冒泡 event.stopPropagation(); //阻止浏览器默认操作 event.preventDefault(); 代码不一定能执行,写给自己看的. 事件冒泡: <a h ...

  6. Java注释

    注释:用于注解说明解释程序的文字.提高了代码的阅读性. 一:单行注释 "//注释文字" 二:多行注释 "/*注释文字*/" 三:文档格式 "/**注释 ...

  7. Python requests 为pfsense 添加Routes

    # !/usr/bin/python 2 # -*- coding: utf-8 -*- __author__ = "Evilxr" import requests ips = o ...

  8. 顶点缓存对象(VBO)

    创建VBO 绘制VBO 更新VBO 实例 GL_ARB_vertex_buffer_object扩展致力于提供顶点数组与显示列表的优势来提升OpenGL效率,同时避免它们实现上的不足.顶点缓存对象(V ...

  9. JavaScriptPolyfillShim 在JavaScript中Shim和Polyfill有什么区别?

    在JavaScript的世界里,有两个词经常被提到,那就是Shim和Polyfill,它们指的都是什么,又有什么区别?在本文中,将简短的给大家介绍他们之间的联系和区别.Shim一个shim就是一个库, ...

  10. Oracle Hints详解

    在向大家详细介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家有用.基于代价的优化器是很聪明的,在绝大多数情况下它会选择 ...