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:
Input: [2,1,1,2]
---------
| |
| |
------------------>
|
Input: true
Explanation: self crossing
Example 2:
Input: [1,2,3,4]
---------
| |
|
|
--------------->
Output: false
Explanation: not self crossing
Example 3:
Input: [1,1,1,1]
---------
| |
| |
-------->
Output: true
Explanation: self crossing
There will be a self crossing problem when the following situations happens.
All the situations’s directions to roate are counter-clockwise.
Situation 1:
Situation 2:
Situation 3:
Then we code arrcording to our above analysis.
bool isSelfCrossing(vector<int>& x)
{
int size = x.size();
if(size <= 3)return false;
for(int i = 3; i < size; i++)
{
if(x[i] >= x[i -2] && x[i - 1] <= x[i - 3])return true;
if(i >= 4 && x[i - 1] == x[i - 3] && x[i - 2] <= x[i] + x[i - 4])return true;
if(i >= 5 && x[i - 3] >= x[i - 1] && x[i - 2] >= x[i - 4] && x[i - 2] <= x[i - 4] + x[i] && x[i - 3] <= x[i - 5] + x[i -1])return true;
}
return false;
}
int main()
{
return 0;
}
The third ”if” in above code includes x[i - 3] >= x[i - 1]
and x[i - 2] >= x[i - 4]
, which is in case of the following situations.