#puzzle
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. Find out if the paths cross.
Solution
Keep track of the axis segments from four steps behind
if the current axes segment is perpendicular (directions are repeating patterns) to the one four step behind and has a point from the tracked axes segment on the current axes segment (either the x or y are same, we know whether it is x or y because they repeat alternatively), then they cross.
bool axis_segments_cross( int x1, int y1, int x2, int y2,
int x3, int y3, int x4, int y4)
{
if (x1 == x2)
{
assert(y3 == y4);
if (y1 <= y3 && y3<= y2) return true;
else return false;
}
if (y1 == y2)
{
assert(x3 == x4);
if (x1 <= x3 && x3 <= x2) return true;
else return false;
}
if (x3 == x4)
{
assert(y1 == y2);
if (y3 <= y2 && y2<= y4) return true;
else return false;
}
if (y3 == y4)
{
assert(x1 == x2);
if (x3 <= x1 && x1 <= x4) return true;
else return false;
}
return false;
}
bool update_axis_segments(List<int>x)
{
Point curr_start, curr_end; // current displacement
Point prev_start, prev_end; // 4 displacements back
for (int i = 0; i < x.Length; i++)
{
//update
switch(i%4)
{
case 0: // North curr_end.y+=x[i] also snapshot previous
case 1: // West curr_end.x-=x[i]
case 2: // South curr_end.y -= x[i];
case 3: // East curr_end.x += x[i];
}
// check
if (axis_segments_cross(curr_start.x, curr_start.y, curr_end.x, curr_end.y,
prev_start.x, prev_start.y, prev_end.x, prev_end.y) == true) return true;
}
return false;
}
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. Find out if the paths cross.
Solution
Keep track of the axis segments from four steps behind
if the current axes segment is perpendicular (directions are repeating patterns) to the one four step behind and has a point from the tracked axes segment on the current axes segment (either the x or y are same, we know whether it is x or y because they repeat alternatively), then they cross.
bool axis_segments_cross( int x1, int y1, int x2, int y2,
int x3, int y3, int x4, int y4)
{
if (x1 == x2)
{
assert(y3 == y4);
if (y1 <= y3 && y3<= y2) return true;
else return false;
}
if (y1 == y2)
{
assert(x3 == x4);
if (x1 <= x3 && x3 <= x2) return true;
else return false;
}
if (x3 == x4)
{
assert(y1 == y2);
if (y3 <= y2 && y2<= y4) return true;
else return false;
}
if (y3 == y4)
{
assert(x1 == x2);
if (x3 <= x1 && x1 <= x4) return true;
else return false;
}
return false;
}
bool update_axis_segments(List<int>x)
{
Point curr_start, curr_end; // current displacement
Point prev_start, prev_end; // 4 displacements back
for (int i = 0; i < x.Length; i++)
{
//update
switch(i%4)
{
case 0: // North curr_end.y+=x[i] also snapshot previous
case 1: // West curr_end.x-=x[i]
case 2: // South curr_end.y -= x[i];
case 3: // East curr_end.x += x[i];
}
// check
if (axis_segments_cross(curr_start.x, curr_start.y, curr_end.x, curr_end.y,
prev_start.x, prev_start.y, prev_end.x, prev_end.y) == true) return true;
}
return false;
}
No comments:
Post a Comment