Number of horizontal or vertical line segments to connect 3 points - GeeksforGeeks

24 Nov, 2021
Given three points on the x-y coordinate plane. You need to find the no. of line segments formed by making a polyline passing through these points. (Line segment can be vertically or horizontally aligned to the coordinate axis) Examples :  
Input : A  = {-1, -1}, B = {-1, 3}, C = {4, 3}
Output :   2
Expantaion:
There are two segments in this polyline.       
Input :A = {1, 1}, B = {2, 3} C = {3, 2}
Output : 3
 
The result is one if all points are on x axis or y axis. The result is 2 if points can form L shape. L shape is formed if any of the three points can be used as a joining point. Otherwise answer is 3.  
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find number of horizontal (or vertical// line segments needed to connect three points.#include <iostream>using namespace std;  // Function to check if the third point forms a // rectangle with other two points at cornersbool isBetween(int a, int b, int c) {    return min(a, b) <= c && c <= max(a, b);}  // Returns true if point k can be used as a joining// point to connect using two line segmentsbool canJoin(int x[], int y[], int i, int j, int k) {    // Check for the valid polyline with two segments    return (x[k] == x[i] || x[k] == x[j]) &&                 isBetween(y[i], y[j], y[k]) ||        (y[k] == y[i] || y[k] == y[j]) &&                 isBetween(x[i], x[j], x[k]);}  int countLineSegments(int x[], int y[]){    // Check whether the X-coordinates or     // Y-cocordinates are same.     if ((x[0] == x[1] && x[1] == x[2]) ||        (y[0] == y[1] && y[1] == y[2]))        return 1;      // Iterate over all pairs to check for two    // line segments    else if (canJoin(x, y, 0, 1, 2) ||            canJoin(x, y, 0, 2, 1) ||             canJoin(x, y, 1, 2, 0))        return 2;      // Otherwise answer is three.    else        return 3;}  // Driver codeint main(){    int x[3], y[3];    x[0] = -1; y[0] = -1;    x[1] = -1; y[1] = 3;    x[2] = 4; y[2] = 3;    cout << countLineSegments(x, y);    return 0;}
// Java program to find number of horizontal// (or vertical line segments needed to// connect three points.import java.io.*;  class GFG {      // Function to check if the third// point forms a rectangle with // other two points at cornersstatic boolean isBetween(int a, int b, int c) {    return (Math.min(a, b) <= c &&                    c <= Math.max(a, b));}  // Returns true if point k can be // used as a joining point to connect// using two line segmentsstatic boolean canJoin(int x[], int y[],                        int i, int j, int k) {    // Check for the valid polyline     // with two segments    return (x[k] == x[i] || x[k] == x[j]) &&                 isBetween(y[i], y[j], y[k]) ||                (y[k] == y[i] || y[k] == y[j]) &&                 isBetween(x[i], x[j], x[k]);}  static int countLineSegments(int x[], int y[]){    // Check whether the X-coordinates or     // Y-cocordinates are same.     if ((x[0] == x[1] && x[1] == x[2]) ||        (y[0] == y[1] && y[1] == y[2]))        return 1;      // Iterate over all pairs to check for two    // line segments    else if (canJoin(x, y, 0, 1, 2) ||            canJoin(x, y, 0, 2, 1) ||             canJoin(x, y, 1, 2, 0))        return 2;      // Otherwise answer is three.    else        return 3;}  // Driver codepublic static void main (String[] args) {      int x[]=new int[3], y[]=new int[3];          x[0] = -1; y[0] = -1;    x[1] = -1; y[1] = 3;    x[2] = 4; y[2] = 3;          System.out.println(countLineSegments(x, y));    }            }  // This code is contributed by vt_m
# Python program to find number# of horizontal (or vertical# line segments needed to# connect three points.  import math  # Function to check if the# third point forms a # rectangle with other# two points at cornersdef isBetween(a, b, c) :      return min(a, b) <= c and c <= max(a, b)     # Returns true if point k# can be used as a joining# point to connect using# two line segmentsdef canJoin( x, y, i, j, k) :      # Check for the valid polyline    # with two segments    return (x[k] == x[i] or x[k] == x[j]) and isBetween(y[i], y[j], y[k]) or (y[k] == y[i] or y[k] == y[j]) and isBetween(x[i], x[j], x[k])     def countLineSegments( x, y):      # Check whether the X-coordinates or     # Y-cocordinates are same.     if ((x[0] == x[1] and x[1] == x[2]) or        (y[0] == y[1] and y[1] == y[2])):        return 1       # Iterate over all pairs to check for two    # line segments    elif (canJoin(x, y, 0, 1, 2) or            canJoin(x, y, 0, 2, 1) or             canJoin(x, y, 1, 2, 0)):        return 2       # Otherwise answer is three.    else:        return 3#driver codex= [-1,-1, 4]y= [-1, 3, 3]  print(countLineSegments(x, y))  # This code is contributed by Gitanjali.
// C# program to find number of horizontal// (or vertical) line segments needed to// connect three points.using System;  class GFG {      // Function to check if the third    // point forms a rectangle with    // other two points at corners    static bool isBetween(int a, int b, int c)    {        return (Math.Min(a, b) <= c &&                           c <= Math.Max(a, b));    }      // Returns true if point k can be    // used as a joining point to connect    // using two line segments    static bool canJoin(int[] x, int[] y,                        int i, int j, int k)    {                  // Check for the valid polyline        // with two segments        return (x[k] == x[i] || x[k] == x[j])                && isBetween(y[i], y[j], y[k])                || (y[k] == y[i] || y[k] == y[j])                && isBetween(x[i], x[j], x[k]);    }      static int countLineSegments(int[] x, int[] y)    {                  // Check whether the X-coordinates or        // Y-cocordinates are same.        if ((x[0] == x[1] && x[1] == x[2]) ||                  (y[0] == y[1] && y[1] == y[2]))            return 1;          // Iterate over all pairs to check for two        // line segments        else if (canJoin(x, y, 0, 1, 2)                       || canJoin(x, y, 0, 2, 1)                       || canJoin(x, y, 1, 2, 0))            return 2;          // Otherwise answer is three.        else            return 3;    }      // Driver code    public static void Main()    {          int[] x = new int[3];        int[] y = new int[3];          x[0] = -1;        y[0] = -1;        x[1] = -1;        y[1] = 3;        x[2] = 4;        y[2] = 3;          Console.WriteLine(countLineSegments(x, y));    }}  // This code is contributed by vt_m.
<?php// PHP program to find number // of horizontal (or vertical// line segments needed to // connect three points.    // Function to check if the // third point forms a // rectangle with other// two points at cornersfunction isBetween( $a, $b, $c) {    return min($a, $b) <= $c and                     $c <= max($a, $b);}  // Returns true if point k // can be used as a joining// point to connect using// two line segmentsfunction canJoin($x, $y, $i, $j, $k) {    // Check for the valid     // polyline with two segments    return ($x[$k] == $x[$i] or             $x[$k] == $x[$j]) and              isBetween($y[$i], $y[$j], $y[$k]) or                              ($y[$k] == $y[$i] or                               $y[$k] == $y[$j]) and                 isBetween($x[$i], $x[$j], $x[$k]);}  function countLineSegments( $x, $y){    // Check whether the X-coordinates      // or Y-cocordinates are same.     if (($x[0] == $x[1] and $x[1] == $x[2]) or        ($y[0] == $y[1] and $y[1] == $y[2]))        return 1;      // Iterate over all pairs to     // check for two line segments    else if (canJoin($x, $y, 0, 1, 2) or              canJoin($x, $y, 0, 2, 1) ||              canJoin($x, $y, 1, 2, 0))        return 2;      // Otherwise answer is three.    else        return 3;}  // Driver code$x = array(); $y = array();$x[0] = -1; $y[0] = -1;$x[1] = -1; $y[1] = 3;$x[2] = 4; $y[2] = 3;echo countLineSegments($x, $y);  // This code is contributed by anuj_67.?>
<script>  // JavaScript program to find number of horizontal// (or vertical line segments needed to// connect three points.  // Function to check if the third// point forms a rectangle with // other two points at cornersfunction isBetween(a, b, c) {    return (Math.min(a, b) <= c &&                    c <= Math.max(a, b));}    // Returns true if point k can be // used as a joining point to connect// using two line segmentsfunction canJoin(x, y,                        i, j, k) {    // Check for the valid polyline     // with two segments    return (x[k] == x[i] || x[k] == x[j]) &&                 isBetween(y[i], y[j], y[k]) ||                (y[k] == y[i] || y[k] == y[j]) &&                 isBetween(x[i], x[j], x[k]);}    function countLineSegments(x, y){    // Check whether the X-coordinates or     // Y-cocordinates are same.     if ((x[0] == x[1] && x[1] == x[2]) ||        (y[0] == y[1] && y[1] == y[2]))        return 1;        // Iterate over all pairs to check for two    // line segments    else if (canJoin(x, y, 0, 1, 2) ||            canJoin(x, y, 0, 2, 1) ||             canJoin(x, y, 1, 2, 0))        return 2;        // Otherwise answer is three.    else        return 3;}// Driver code                  let x = [], y = [];            x[0] = -1; y[0] = -1;    x[1] = -1; y[1] = 3;    x[2] = 4; y[2] = 3;            document.write(countLineSegments(x, y));  </script>
Output :  
  2
 
vt_m
code_hunt
Competitive Programming
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Prefix Sum Array - Implementation and Applications in Competitive Programming
Ordered Set and GNU C++ PBDS
Modulo 10^9+7 (1000000007)
Multistage Graph (Shortest Path)
7 Best Coding Challenge Websites in 2020
How to check if a given point lies inside or outside a polygon?
Closest Pair of Points using Divide and Conquer algorithm
How to check if two given line segments intersect?
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)
Find if two rectangles overlap