UVALIVE 5893 计算几何+搜索
题意:很复杂的题意,我描述不清楚。
题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=3033#problem/33526
大致是,给定一个起点,一个终点,和一些墙,这些墙是不能越过的,然后一个人他每次走可以往四个方向走,可以加速,可以减速,也可以匀速。
也不一定是四个方向,因为他有一个VX,VY,所以每次走的方向其实都是不固定的,所以的四个方向就是他加速度的方向就是这四个。大家理解就好。
然后要从起点开始,走到终点,问最少需要多少步,而且走到终点的时候速度必须是0。
这道题的搜索部分其实很好想到,BFS开四维记录坐标和当前的VX,VY 。
因为速度有负的,所以我把起始速度开到16 。
然后搜索部分没什么问题了,对于计算几何部分的话,就是一个线段交的模版,没敲错基本上没问题。
CODE:.
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos(-1.0)
#define inf 0x3fffffff
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) using namespace std; struct Point {
int x , y ;
Point() {}
Point(int xx ,int yy) : x(xx) , y(yy) {}
};
struct stline {
Point a,b;
} line1,line2;
int n , m ;
int num ;
int sx , sy , ex , ey ;
struct WAll {
int sx , sy , ex ,ey ;
} w[11] ; #define N 64
int dis[N][N][32][32] ;
queue<pair<PII, PII> > qe ;
#define MP(a , b , c , d) mp(mp(a, b) , mp(c , d))
int mx[] = {1 , -1 , 0 ,0 , 0 } ;
int my[] = {0 , 0 , 0 ,1 , -1 } ;
int inmap(int x ,int y) {
if(x >= 0 && x < n && y >= 0 && y < m)return 1 ;
return 0 ;
} int dblcmp(double a,double b) {
if (fabs(a-b)<=1E-6) return 0;
if (a>b) return 1;
else return -1;
}
//***************点积判点是否在线段上***************
double dot(double x1,double y1,double x2,double y2) { //点积
return x1*x2+y1*y2;
}
int point_on_line(Point a,Point b,Point c) { //求a点是不是在线段bc上,>0不在,=0与端点重合,<0在。
return dblcmp(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y),0);
}
//**************************************************
double cross(double x1,double y1,double x2,double y2) { //叉积
return x1*y2-x2*y1;
}
double ab_cross_ac(Point a,Point b,Point c) { //ab与ac的叉集
return cross(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int ab_cross_cd (Point a,Point b,Point c,Point d) { //求ab是否与cd相交
double s1,s2,s3,s4;
int d1,d2,d3,d4;
Point p;
d1=dblcmp(s1=ab_cross_ac(a,b,c),0);
d2=dblcmp(s2=ab_cross_ac(a,b,d),0);
d3=dblcmp(s3=ab_cross_ac(c,d,a),0);
d4=dblcmp(s4=ab_cross_ac(c,d,b),0);
//如果规范相交则求交点
if ((d1^d2)==-2 && (d3^d4)==-2) {
p.x=(c.x*s2-d.x*s1)/(s2-s1);
p.y=(c.y*s2-d.y*s1)/(s2-s1);
return 1;
} //如果不规范相交
if (d1==0 && point_on_line(c,a,b)<=0) {
p=c;
return 1 ;
}
if (d2==0 && point_on_line(d,a,b)<=0) {
p=d;
return 1 ;
}
if (d3==0 && point_on_line(a,c,d)<=0) {
p=a;
return 1 ;
}
if (d4==0 && point_on_line(b,c,d)<=0) {
p=b;
return 1 ;
}
//如果不相交
return 0;
} int check(int x ,int y ,int xx ,int yy){
Point p1(x ,y) ;
Point p2(xx ,yy) ;
for (int i = 0 ; i < num ; i ++ ){
Point p3(w[i].sx , w[i].sy) ;
Point p4(w[i].ex , w[i].ey) ;
if(ab_cross_cd(p1 , p2 , p3 , p4)) return 1 ;
}
return 0 ;
}
int bfs() {
while(!qe.empty())qe.pop() ;
qe.push(MP(sx , sy , 16 , 16)) ;
for (int i = 0 ; i < N ; i ++ ) {
for (int j = 0 ; j < N ; j ++ ) {
for (int k = 0 ; k < N / 2; k ++ )
for (int x = 0 ; x < N / 2 ; x ++ )
dis[i][j][k][x] = inf ;
}
}
dis[sx][sy][16][16] = 0 ;
while(!qe.empty()) {
pair<PII , PII > tp = qe.front() ;
qe.pop() ;
for (int i = 0 ; i < 5 ; i ++ ) {
int vx = tp.SE.FI + mx[i] - 16 ;
int vy = tp.SE.SE + my[i] - 16 ;
int tx = tp.FI.FI + vx ;
int ty = tp.FI.SE + vy ;
if(inmap(tx ,ty) && vx > -16 && vy > -16 && vx < 16 && vy < 16 && !check(tp.FI.FI ,tp.FI.SE , tx ,ty)) {
if(dis[tx][ty][vx + 16][vy + 16] > dis[tp.FI.FI][tp.FI.SE][vx - mx[i] + 16][vy - my[i] + 16] + 1 ) {
dis[tx][ty][vx + 16][vy + 16] = dis[tp.FI.FI][tp.FI.SE][vx - mx[i] + 16][vy - my[i] + 16] + 1 ;
qe.push(MP(tx , ty , vx + 16, vy + 16)) ;
}
}
}
}
return dis[ex][ey][16][16] ;
}
int main() {
while(cin >> m >> n ) {
cin >> sy >> sx >> ey >> ex ;
cin >> num ;
for (int i = 0 ; i < num ; i ++ )cin >> w[i].sy >> w[i].sx >> w[i].ey >> w[i].ex ;
int fk = bfs() ;
cout << fk << endl;
}
return 0 ;
}
UVALIVE 5893 计算几何+搜索的更多相关文章
- BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线
正解:计算几何+搜索+扫描线 解题报告: 传送门 哇我是真的觉得这题很妙了!各个方面都很妙啊... 首先有一个很重要的结论:最优线一定可以通过各种变换(旋转/平移)使得经过一条线段的左端点(...并不 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- NOIP考点
NOIP考点 基础算法 图 树 数论 数据结构 动态规划 搜索 其他算法 省选知识点汇总 图论 数据结构 字符串相关算法及数据结构 数学 计算几何 搜索 动态规划 其他算法 转自:巨佬的博客 加*号是 ...
- poj2148
题意:给出若干个没有公共面积的多边形,几个多边形可能属于同一个国家,要求给这个地图染色,同一个国家用相同的颜色,相邻国家不能用相同颜色.问最少需要多少种颜色. 分析:计算几何+搜索.先判断哪些多边形是 ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?
题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s. 如此往复,直到fx[n] = 1,此时的x就是n的”K ...
- UVALive 6255 Kingdoms --状态搜索
题意:n个国家,给出国家间相互的债务关系,每个国家如果债务>收入就要破产,破产后该国的所有债务关系全部清除,第一个破产的国家不同有可能造成最后的没破产的国家的不同,问哪些国家有可能成为独自存活的 ...
- UVALive 6470 Chomp --记忆化搜索
题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否 ...
- UVALive 4426 Blast the Enemy! 计算几何求重心
D - Blast the Enemy! Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
随机推荐
- Topas命令详解
Topas命令详解 执行topas命令后如图所示: #topas 操作系统的最全面动态,而又查看方便的性能视图就是topas命令了,下面以topas输出为例,对AIX系统的性能监控做简要描述,供运维工 ...
- 不用Google Adsense的84个赚钱方法
这是一个关于网络广告商和网络销售的汇总列表,可以用来为您的网站或博客赚点钱.广告商都是英文的,加入广告请确认其是否支持中国地区支持,不支持的话就不必加入了. Chitika : 购物中心旗帜广告. ( ...
- 微信小程序开发之入门篇(熟悉开发工具)
个人的每一篇博文都谈不上有什么技术含量,只是为了帮助不熟悉微信小程序开发的自己及他人提供一下思路.谢谢,下面开始! PS: 因为本人没有小程序的内测资格,所以所有的开发及Demo都是无AppId的,如 ...
- Become a Windows Insider and Test New Windows 10 Features
SR: To write an Edge browser extension. Microsoft is releasing Windows 10 build 14291 with browser e ...
- meta标签常用属性整理
在segmentfault看到这篇文章,觉得整理的很详细,所以转载过来和大家分享一下. 原文地址:http://segmentfault.com/blog/ciaocc/119000000240791 ...
- shell 脚本中 命令
终端工具tput和stty是两款终端处理工具tput cols,lines,longname,cpu 100 100 输入密码时,不能让输入的内容显示出来.用stty #!/bin/bash #Fil ...
- tomcat架构分析-索引
出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...
- Linux查看端口号
查看端口占用情况的命令:lsof -i 查看某一端口的占用情况: lsof -i:端口号 结束占用端口的进程:killall 进程名 也可使用命令: netstat -apn|grep <端口号 ...
- JSP技术的优缺点介绍
什么是JSP?JSP可用一种简单易懂的等式表示为:HTML+Java=JSP. JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑. 网页还能通过 ...
- 转:PHP开发框架流行度排名:Laravel居首
原文来自于:http://www.sitepoint.com/best-php-frameworks-2014/ Update: If you’d like to take part in the n ...