zoukankan      html  css  js  c++  java
  • 图5 Saving James Bond

    题目:
    https://pintia.cn/problem-sets/1268384564738605056/problems/1284061680920891392
    题解:https://blog.csdn.net/tuzigg123/article/details/46897871
    代码:

        /*2015.7.15cyq*/
        #include <iostream>
        #include <vector>
        #include <math.h>
        #include <queue>
        #include <fstream>
        #include <map>
        using namespace std;
         
        //ifstream fin("case1.txt");
        //#define cin fin
         
        struct point{
            float x;
            float y;
            bool canEscape;
            int prePoint;//BFS时的前驱结点,便于从终点回溯到起点,用于输出路径
        };
        int main(){
            int N,D;
            cin>>N>>D;
            if(D>=50){
                cout<<"1"<<endl;
                return 0;
            }
            vector<point> vexs(N);
            vector<vector<bool> > edges(N,vector<bool>(N,false));
         
            for(int i=0;i<N;i++){//鳄鱼序号为0到N-1
                cin>>vexs[i].x>>vexs[i].y;
                if(fabs(vexs[i].x)+D>=50||fabs(vexs[i].y)+D>=50){
                    vexs[i].canEscape=true;  //标记能一步跳到岸边的点
                }else
                    vexs[i].canEscape=false;
            }
            for(int i=0;i<N;i++){
                for(int j=i+1;j<N;j++){
                    float dx=vexs[i].x-vexs[j].x;
                    float dy=vexs[i].y-vexs[j].y;
                    if(dx*dx+dy*dy<=D*D){//标记能够两两连通的点
                        edges[i][j]=true;
                        edges[j][i]=true;
                    }
                }
            }
            //BFS
            queue<int> cur,next;
            vector<int> visited(N,false);
            map<float,int> firstJump;
         
            for(int i=0;i<N;i++){
                float tmp=vexs[i].x*vexs[i].x+vexs[i].y*vexs[i].y;
                if(tmp<=(D+7.5)*(D+7.5)){
                    firstJump[tmp]=i;  //用map对第一跳的点的距离进行自动升序排序
                    vexs[i].prePoint=-1;//前驱结点为-1,表示原点
                }
            }
            for(auto it=firstJump.begin();it!=firstJump.end();++it){
                    cur.push((*it).second);//第一跳能跳到的点从小到大入队
                    visited[(*it).second]=true;
            }
         
            bool find=false;
            vector<int> result;
            while(!cur.empty()){
                if(find)
                    break;
                while(!cur.empty()){
                    int root=cur.front();
                    cur.pop();
                    if(vexs[root].canEscape){
                        while(vexs[root].prePoint!=-1){
                            result.push_back(root);
                            root=vexs[root].prePoint;
                        }
                        result.push_back(root);
                        find=true;
                        break;
                    }
                    for(int i=0;i<N;i++){
                        if(edges[root][i]&&!visited[i]){
                            next.push(i);
                            visited[i]=true;
                            vexs[i].prePoint=root;//每个结点入队时都要记录其前驱结点
                        }
                    }
                }
                swap(cur,next);
            }
            
            int n=result.size();
            if(n==0)
                cout<<"0"<<endl;
            else{
                cout<<n+1<<endl;
                for(int i=n-1;i>=0;i--)
                    cout<<vexs[result[i]].x<<" "<<vexs[result[i]].y<<endl;
            }
            return 0;
        }
  • 相关阅读:
    获取web应用路径 // "/" 表示class 根目录
    C++ Knowledge series Inheritance & RTTI & Exception Handling
    ATL
    GCC & Maker
    NoSQL(Not Only SQL)
    ECMAScript Regex
    C++ Knowledge series Conversion & Constructor & Destructor
    Cloud Computing
    C++ Knowledge series STL & Const
    Java Knowledge series 7
  • 原文地址:https://www.cnblogs.com/simon-chou/p/13620050.html
Copyright © 2011-2022 走看看