Saving James Bond - Hard Version java实现

与简单版的区别在于,要找出最少跳跃路径,并记录下跳跃位置。我还没有完成在相同跳跃数时输出第一跳最短距离的方法,目前思路是将第一次跳跃的点按距离从小到大排序,依次入队。

import java.util.LinkedList;
import java.util.Scanner;
//声明鳄鱼节点,小岛节点为x=0,y=0的节点
class Node
{
    int x;
    int y;

    public Node(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
    //计算当前鳄鱼和制定鳄鱼的距离
    public double getDistant(Node node)
    {
        //如果当前节点是小岛,要考虑小岛的半径
        if (this.x==0&&this.y==0)
            return ( Math.sqrt(Math.pow(node.x, 2)+Math.pow(node.y, 2))-7.5);
        
        else
            return Math.sqrt((this.x-node.x)*(this.x-node.x)+(this.y-node.y)*(this.y-node.y));
    }
    //计算当前鳄鱼到岸边的最短距离
    public double getDistant()
    {
        double nearest= (50-Math.abs(x))>(50-Math.abs(y))?(50-Math.abs(y)):(50-Math.abs(x));
        return nearest;
    }
}
//声明图类型
class Graph
{
    Node[] arr;
    int distant;
    boolean[] visited;
    //记录到相应鳄鱼的跳跃次数
    int[] dist;
    //记录跳到当前位置的上一个跳跃点的位置
    int[] path;
    public Graph(Node[] arr,int jumpDst)
    {
        this.arr=arr;
        distant=jumpDst;
        visited=new boolean[arr.length];
        dist=new int[arr.length];
        path=new int[arr.length];
        //初始化dist和path
        for (int i=0;i<arr.length ;i++ )
        {
            visited[i]=false;
            dist[i]=-1;
            path[i]=-1;
        }
    }
    //根绝元素获取其在数组中的位置
    public int getIndex(Node n,Node[] arr)
    {
        for (int i=0;i<arr.length ;i++ )
        {
            if (n.x==arr[i].x&&n.y==arr[i].y)
                return i;
            
        }
        return -1;
    }
    public boolean serchBFS()
    {
        //因为不论是否有节点到岸边距离小于跳跃距离,都要从小岛上出发,因此只考虑包含小岛节点的连通集
        if(distant>=50-7.5)
        {
            System.out.print(1);
            return true;
        }
        LinkedList<Node> l=new LinkedList<>();
        visited[0]=true;
        dist[0]=0;
        //对第一跳能跳上的点从小到大排序
        
     
        l.add(arr[0]);
        while (l.size()>0)
        {
            Node n=l.remove();
            if (n.getDistant()<=distant)
            {
                int temp=dist[getIndex(n,arr)];
                System.out.println(temp+1);
                while(path[getIndex(n,arr)]!=-1)
                {
                    System.out.println(arr[getIndex(n,arr)].x+" "+arr[getIndex(n,arr)].y);
                    n=arr[path[getIndex(n,arr)]];
                }
                return true;
            }
            
            for (int j=0;j<arr.length ;j++ )
            {
                
                if (n.getDistant(arr[j])<=distant&&visited[j]==false)
                {
                    visited[j]=true;
                    dist[j]=dist[getIndex(n,arr)]+1;
                    path[j]=getIndex(n,arr);
                    l.add(arr[j]);
                }
            }
        }
        System.out.print(0);
        return false;
    }
}
//测试类
public class test
{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        int jumpDst=sc.nextInt();
        Node[] arr=new Node[num+1];
        arr[0]=new Node(0,0);
        for (int i=1;i<num+1 ;i++ )
        {
            int x=sc.nextInt();
            int y=sc.nextInt();

            arr[i]=new Node(x,y);

        }
        Graph g=new Graph(arr,jumpDst);
        g.serchBFS();
        
        
    }
}

 

posted on 2018-05-28 20:41  yfyfyf947  阅读(159)  评论(0编辑  收藏  举报