Self Crossing

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Self Crossing相关的知识,希望对你有一定的参考价值。

You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west, x[2] metres to the south,x[3] metres to the east and so on. In other words, after each move your direction changes counter-clockwise.

Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.

Example 1:

Given x = [2, 1, 1, 2],
┌───┐
│   │
└───┼──>
    │

Return true (self crossing)

 

Example 2:

Given x = [1, 2, 3, 4],
┌──────┐
│      │
│
│
└────────────>

Return false (not self crossing)

 

Example 3:

Given x = [1, 1, 1, 1],
┌───┐
│   │
└───┼>

Return true (self crossing)

思路:如果相交,必定是经过同一点,记录所有点,比较即可。

int a = 0,b = 0,len = x.length;
        
        HashSet<String> recodePoint = new HashSet<String>();
        
        recodePoint.add(a + "-" + b);//start point
        
        if(len == 0)
            return false;
        
        for (int i = 0; i < len; i++) {
            if(i % 4 == 0){
                for(int j = 0;j < x[i]; j++){
                    String point = a+"-"+ ++b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            }
            if(i % 4 == 1)
                for(int j = 0;j < x[i]; j++){
                    String point = --a+"-"+b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            if(i % 4 == 2)
                for(int j = 0;j < x[i]; j++){
                    String point = a+"-"+ --b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            if(i % 4 == 3)
                for(int j = 0;j < x[i]; j++){
                    String point = ++a+"-"+ b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
        }
        return false;

 

以上是关于Self Crossing的主要内容,如果未能解决你的问题,请参考以下文章

Self Crossing

[LeetCode][JavaScript]Self Crossing

LeetCode 335:Self Crossing 自交

LeetCode 335. Self Crossing

代码源 Div1#104no crossing,Codeforces 793D,2100分,区间dp

LeetCodeSelf Crossing(335)