UVALIVE 5893 計算幾何+搜尋

來源:互聯網
上載者:User

題意:很複雜的題意,我描述不清楚。

題目連結: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;inline int sgnInt(ll x){    if(x < 0)return -1 ;    return x > 0 ;}int n , m ;int num ;int sx , sy , ex , ey ;struct WAll {    int sx , sy , ex ,ey ;} w[11] ;#define N 64int 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 ;}struct Point{    long long x, y;    Point(const long long &x = 0, const long long &y = 0):x(x), y(y){}    Point operator - (const Point  &a)const{ return Point(x - a.x, y - a.y);}    bool operator <= (const Point &a)const{ return x <  a.x || (x == a.x && y <= a.y);}    bool operator >= (const Point &a)const{ return x >  a.x || (x == a.x && y >= a.y) ;}    friend long long det(const Point &a, const Point &b){ return a.x * b.y - a.y * b.x;}    void in(){        scanf("%lld %lld", &x, &y);    }};struct Line{    Point s, t;    Line(const Point &s = Point(), const Point &t = Point()):s(s), t(t){}    bool isSameSide(const Point &a, const Point &b)const{        long long k1 = det(a - s, t - s), k2 =  det(b - s, t - s);        return  sgnInt(k1) * sgnInt(k2) > 0;    }    friend bool lineInsectLine(Line &l1, Line &l2){        if(l1.t <= l1.s)swap(l1.s, l1.t);        if(l2.t <= l2.s)swap(l2.s, l2.t);        if(det(l2.s - l1.s, l1.t - l1.s) == 0 && det(l2.t - l1.s, l1.t - l1.s) == 0           &&det(l1.s - l2.s, l2.t - l2.s) == 0 && det(l1.t - l2.s, l2.t - l2.s) == 0){            bool res1 = (l2.s <= l1.t && l2.s >= l1.s),                 res2  =  (l2.t <= l1.t && l2.t >= l1.s),                 res3 = (l1.s <= l2.t && l1.s >= l2.s),                 res4 = (l1.t <= l2.t && l1.t >= l2.s);                return res1 || res2 || res3 || res4;        }        return (!l1.isSameSide(l2.s, l2.t) && !l2.isSameSide(l1.s, l1.t));    }    void in(){        s.in();        t.in();    }};int check(int x ,int y ,int xx ,int yy){    Point p1(x ,y) ;    Point p2(xx ,yy) ;    Line l1(p1 , p2) ;    for (int i = 0 ; i < num ; i ++ ){        Point p3(w[i].sx , w[i].sy) ;        Point p4(w[i].ex , w[i].ey) ;        Line l2(p3 ,p4) ;        if(lineInsectLine(l1 ,l2))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 ;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.