轨迹碰撞
轨迹碰撞:给你一个数组,只能从右上左下走,如果能撞上返回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; } }