轨迹碰撞

轨迹碰撞:给你一个数组,只能从右上左下走,如果能撞上返回true

否则返回false

 

右上左下

3 4 2 1 1 

0 1 2 3 4 

 

分析:

0位置会不会撞上?不会,和谁撞呢

1位置会不会撞上?不会,它和0位置是垂直的,和谁撞呢

2位置会不会撞上?不会,它和0位置是平行的,只是方向相反

if(arr==null||arr.length<=3) return false;

3位置会不会撞上?有可能,那么撞上的条件是什么?

[2] <=[0] && [3]>=[1]

 

 

 

如果此时撞上了,那么直接返回true

如果没有撞上,该如何继续?  

  

 

 

 

分析4位置上

3位置没有撞上的条件下,4位置撞上的条件是什么?

[3]<=1 && [4]>=[2]

||

[3]==1 && [4]+[0]>=2

分析了前面5条线段,前5条线段怎么判段?人为手工判段

现在假设我来到了第i条线段,方向是什么,不重要,不影响我的撞这件事

分析I可能会和谁撞

I不会和i-1,i-2撞,分别是垂直和平行关系

I有可能会和i-3撞,撞上的条件是什么?

[i-3]>=[i-1] && [I]>=[i-2] 

 

 

 

  I会不会有可能和i-4撞上呢?会,撞上的条件是什么?

[i-1]==[i-3] && [I]+[i-4]>=[i-2] 

 

 

 

 

 I会不会有可能和i-5撞上?有可能,撞上的条件是什么?

[i-1]<=[i-3] && [I]+[I-4]>=[i-2]

 

 

 

I会不会有可能和i-6撞上?情况都是头撞头,和i-5是一样的。因为撞i-6,必撞i-5

I会不会有可能和i-7撞上?不可能,因为i-7包裹在里面了,如果撞上i-7,之前必撞过其他的。

至此,分析完。

public class SelfCrossing {
    public static boolean isSelfCrossing(int[] x){
        if(x==null ||x.length<4){
            return false;
        }
        boolean length4= x.length>3
                && x[2]<=x[0]
                && x[3]>=x[1];
        boolean length5=x.length>4
                && (
                        (x[3]<=x[1] && x[4]>=x[2])
                        || (x[3]==x[1] && x[0]+x[4]>=x[2])
                 );
        if(length4||length5){
            return true;
        }

        for(int i=5;i<x.length;i++){
            //i-1,i-2 no cross
            //i-3
            boolean i3Flag=x[i-1]<=x[i-3] && x[i]>=x[i-2];
            boolean i4Flag=x[i-1]==x[i-3] && x[i]+x[i-4]>=x[i-2];
            boolean i5Flag=x[i-1]<=x[i-3] && x[i]+x[i-4]>=x[i-2];
            if(i3Flag||i4Flag||i5Flag){
                return true;
            }
        }
        return false;

    }
}

  

posted @ 2021-09-11 13:33  sherry001  阅读(90)  评论(0编辑  收藏  举报