Open In App

Print K’th element in spiral form of matrix

Given a 2D Matrix of order n X m, print K’th element in the spiral form of the matrix. See the following examples. 

Examples: 



Input: mat[][] = 
          {{1, 2, 3, 4}
           {5, 6, 7, 8}
           {9, 10, 11, 12}
           {13, 14, 15, 16}}
       k = 6
Output: 12
Explanation: The elements in spiral order is 
1, 2, 3, 4, 8, 12, 16, 15...
so the 6th element is 12

Input: mat[][] =
       {{1, 2, 3, 4, 5, 6}
        {7, 8, 9, 10, 11, 12}
        {13, 14, 15, 16, 17, 18}}
       k = 17
Output: 10
Explanation: The elements in spiral order is 
1, 2, 3, 4, 5, 6, 12, 18, 17,
16, 15, 14, 13, 7, 8, 9, 10, 11 
so the 17 th element is 10.  

Simple Approach: One simple solution is to start traversing matrix in spiral form Print Spiral Matrix and start a counter i.e; count = 0. Whenever count gets equal to K, print that element.

Implementation:






#include <bits/stdc++.h>
using namespace std;
#define R 3
#define C 6
 
void spiralPrint(int m, int n, int a[R][C], int c)
{
    int i, k = 0, l = 0;
    int count = 0;
 
    /* k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator
    */
 
    while (k < m && l < n) {
        /* check the first row from
            the remaining rows */
        for (i = l; i < n; ++i) {
            count++;
 
            if (count == c)
                cout << a[k][i] << " ";
        }
        k++;
 
        /* check the last column
        from the remaining columns */
        for (i = k; i < m; ++i) {
            count++;
 
            if (count == c)
                cout << a[i][n - 1] << " ";
        }
        n--;
 
        /* check the last row from
                the remaining rows */
        if (k < m) {
            for (i = n - 1; i >= l; --i) {
                count++;
 
                if (count == c)
                    cout << a[m - 1][i] << " ";
            }
            m--;
        }
 
        /* check the first column from
                the remaining columns */
        if (l < n) {
            for (i = m - 1; i >= k; --i) {
                count++;
 
                if (count == c)
                    cout << a[i][l] << " ";
            }
            l++;
        }
    }
}
 
/* Driver program to test above functions */
int main()
{
    int a[R][C] = { { 1, 2, 3, 4, 5, 6 },
                    { 7, 8, 9, 10, 11, 12 },
                    { 13, 14, 15, 16, 17, 18 } },
        k = 17;
 
    spiralPrint(R, C, a, k);
    return 0;
}




import java.io.*;
 
class GFG {
    static int R = 3;
    static int C = 6;
 
    static void spiralPrint(int m, int n, int[][] a, int c)
    {
        int i, k = 0, l = 0;
        int count = 0;
     
        /* k - starting row index
            m - ending row index
            l - starting column index
            n - ending column index
            i - iterator
        */
     
        while (k < m && l < n) {
            /* check the first row from
                the remaining rows */
            for (i = l; i < n; ++i) {
                count++;
     
                if (count == c)
                    System.out.println(a[k][i]+" ");
            }
            k++;
     
            /* check the last column
            from the remaining columns */
            for (i = k; i < m; ++i) {
                count++;
     
                if (count == c)
                    System.out.println(a[i][n - 1]+" ");
            }
            n--;
     
            /* check the last row from
                    the remaining rows */
            if (k < m) {
                for (i = n - 1; i >= l; --i) {
                    count++;
     
                    if (count == c)
                         
                    System.out.println(a[m - 1][i]+" ");
                }
                m--;
            }
     
            /* check the first column from
                    the remaining columns */
            if (l < n) {
                for (i = m - 1; i >= k; --i) {
                    count++;
     
                    if (count == c)
                        System.out.println(a[i][l]+" ");
                }
                l++;
            }
        }
    }
     
    /* Driver program to test above functions */
    public static void main (String[] args)
    {
        int a[][] = { { 1, 2, 3, 4, 5, 6 },
                        { 7, 8, 9, 10, 11, 12 },
                        { 13, 14, 15, 16, 17, 18 } };
        int k = 17;
     
        spiralPrint(R, C, a, k);
    }
}
 
// This code is contributed by shivanisinghss2110




R = 3
C = 6
 
def spiralPrint(m, n, a, c):
    k = 0
    l = 0
    count = 0
    """ k - starting row index
    m - ending row index
    l - starting column index
    n - ending column index
    i - iterator
    """
    while (k < m and l < n):
        for i in range(l,n):
            count+=1
             
            if (count == c):
                print(a[k][i] , end=" ")
         
        k+=1
        """ check the last column
        from the remaining columns """
        for i in range(k,m):
            count+=1
            if (count == c):
                print(a[i][n - 1],end=" ")
        n-=1
        """ check the last row from
        the remaining rows """
        if (k < m):
            for i in range(n - 1,l-1,-1):
                count+=1
                if (count == c):
                    print(a[m - 1][i],end=" ")
            m-=1
        """ check the first column from
        the remaining columns """
        if (l < n):
            for i in range(m - 1,k-1,-1):
                count+=1
                if (count == c):
                    print(a[i][l],end=" ")
            l+=1
 
""" Driver program to test above functions """
 
a = [[1, 2, 3, 4, 5, 6 ],[ 7, 8, 9, 10, 11, 12 ],[ 13, 14, 15, 16, 17, 18]]
k = 17
spiralPrint(R, C, a, k)
 
# This code is contributed by shivanisingh




using System;
class GFG
{
 
  static int R = 3;
  static int C = 6;
  static void spiralPrint(int m, int n,
                          int[,] a, int c) 
  
    int i, k = 0, l = 0; 
    int count = 0; 
 
    /* k - starting row index 
            m - ending row index 
            l - starting column index 
            n - ending column index 
            i - iterator 
        */
 
    while (k < m && l < n)
    {
 
      /* check the first row from 
                the remaining rows */
      for (i = l; i < n; ++i)
      
        count++; 
 
        if (count == c) 
          Console.WriteLine(a[k, i] + " ");
      
      k++; 
 
      /* check the last column 
            from the remaining columns */
      for (i = k; i < m; ++i)
      
        count++; 
 
        if (count == c) 
          Console.WriteLine(a[i, n - 1] + " ");
      
      n--; 
 
      /* check the last row from 
                    the remaining rows */
      if (k < m)
      
        for (i = n - 1; i >= l; --i)
        
          count++; 
 
          if (count == c) 
 
            Console.WriteLine(a[m - 1, i] + " ");
        
        m--; 
      
 
      /* check the first column from 
                    the remaining columns */
      if (l < n)
      
        for (i = m - 1; i >= k; --i)
        
          count++; 
 
          if (count == c) 
            Console.WriteLine(a[i, l] + " "); 
        
        l++; 
      
    
  }
 
  // Driver code
  static void Main()
  {
    int[,] a = { { 1, 2, 3, 4, 5, 6 }, 
                { 7, 8, 9, 10, 11, 12 }, 
                { 13, 14, 15, 16, 17, 18 } }; 
    int k = 17; 
    spiralPrint(R, C, a, k); 
  }
}
 
// This code is contributed by divyeshrabadiya07.




<script>
 
    let R = 3;
    let C = 6;
     
    function spiralPrint(m, n, a, c)
    {
        let i, k = 0, l = 0;
        let count = 0;
 
        /* k - starting row index
            m - ending row index
            l - starting column index
            n - ending column index
            i - iterator
        */
 
        while (k < m && l < n) {
            /* check the first row from
                the remaining rows */
            for (i = l; i < n; ++i) {
                count++;
 
                if (count == c)
                    document.write(a[k][i] + " ");
            }
            k++;
 
            /* check the last column
            from the remaining columns */
            for (i = k; i < m; ++i) {
                count++;
 
                if (count == c)
                    document.write(a[i][n - 1] + " ");
            }
            n--;
 
            /* check the last row from
                    the remaining rows */
            if (k < m) {
                for (i = n - 1; i >= l; --i) {
                    count++;
 
                    if (count == c)
                        document.write(a[m - 1][i] + " ");
                }
                m--;
            }
 
            /* check the first column from
                    the remaining columns */
            if (l < n) {
                for (i = m - 1; i >= k; --i) {
                    count++;
 
                    if (count == c)
                        document.write(a[i][l] + " ");
                }
                l++;
            }
        }
    }
   
      let a = [ [ 1, 2, 3, 4, 5, 6 ],
             [ 7, 8, 9, 10, 11, 12 ],
             [ 13, 14, 15, 16, 17, 18 ] ],
        k = 17;
  
    spiralPrint(R, C, a, k);
     
</script>

Output
10 

Complexity Analysis: 

Efficient Approach: While traversing the array in spiral order, a loop is used to traverse the sides. So if it can be found out that the kth element is in the given side then the kth element can be found out in constant time. This can be done recursively as well as iteratively.

Implementation:




// C++ program for Kth element in spiral
// form of matrix
#include <bits/stdc++.h>
#define MAX 100
using namespace std;
 
/* function for Kth element */
int findK(int A[MAX][MAX], int n, int m, int k)
{
    if (n < 1 || m < 1)
        return -1;
 
    /*....If element is in outermost ring ....*/
    /* Element is in first row */
    if (k <= m)
        return A[0][k - 1];
 
    /* Element is in last column */
    if (k <= (m + n - 1))
        return A[(k - m)][m - 1];
 
    /* Element is in last row */
    if (k <= (m + n - 1 + m - 1))
        return A[n - 1][m - 1 - (k - (m + n - 1))];
 
    /* Element is in first column */
    if (k <= (m + n - 1 + m - 1 + n - 2))
        return A[n - 1 - (k - (m + n - 1 + m - 1))][0];
 
    /*....If element is NOT in outermost ring ....*/
    /* Recursion for sub-matrix. &A[1][1] is
    address to next inside sub matrix.*/
    return findK((int(*)[MAX])(&(A[1][1])), n - 2,
                 m - 2, k - (2 * n + 2 * m - 4));
}
 
/* Driver code */
int main()
{
    int a[MAX][MAX] = { { 1, 2, 3, 4, 5, 6 },
                        { 7, 8, 9, 10, 11, 12 },
                        { 13, 14, 15, 16, 17, 18 } };
    int k = 17;
    cout << findK(a, 3, 6, k) << endl;
    return 0;
}




// Java program for Kth element in spiral
// form of matrix
import java.io.*;
class GFG {
 
    static int MAX = 100;
 
    /* function for Kth element */
    static int findK(int A[][], int i, int j,
                     int n, int m, int k)
    {
        if (n < 1 || m < 1)
            return -1;
 
        /*.....If element is in outermost ring ....*/
        /* Element is in first row */
        if (k <= m)
            return A[i + 0][j + k - 1];
 
        /* Element is in last column */
        if (k <= (m + n - 1))
            return A[i + (k - m)][j + m - 1];
 
        /* Element is in last row */
        if (k <= (m + n - 1 + m - 1))
            return A[i + n - 1][j + m - 1 - (k - (m + n - 1))];
 
        /* Element is in first column */
        if (k <= (m + n - 1 + m - 1 + n - 2))
            return A[i + n - 1 - (k - (m + n - 1 + m - 1))][j + 0];
 
        /*.....If element is NOT in outermost ring ....*/
        /* Recursion for sub-matrix. &A[1][1] is
    address to next inside sub matrix.*/
        return findK(A, i + 1, j + 1, n - 2,
                     m - 2, k - (2 * n + 2 * m - 4));
    }
 
    /* Driver code */
    public static void main(String args[])
    {
        int a[][] = { { 1, 2, 3, 4, 5, 6 },
                      { 7, 8, 9, 10, 11, 12 },
                      { 13, 14, 15, 16, 17, 18 } };
        int k = 17;
        System.out.println(findK(a, 0, 0, 3, 6, k));
    }
}
 
// This code is contributed by Arnab Kundu




# Python3 program for Kth element in spiral
# form of matrix
MAX = 100
 
''' function for Kth element '''
def findK(A, n, m, k):
     
    if (n < 1 or m < 1):
        return -1
         
    '''....If element is in outermost ring ....'''
    ''' Element is in first row '''
    if (k <= m):
        return A[0][k - 1]
         
    ''' Element is in last column '''
    if (k <= (m + n - 1)):
        return A[(k - m)][m - 1]
         
    ''' Element is in last row '''
    if (k <= (m + n - 1 + m - 1)):
        return A[n - 1][m - 1 - (k - (m + n - 1))]
     
    ''' Element is in first column '''
    if (k <= (m + n - 1 + m - 1 + n - 2)):
        return A[n - 1 - (k - (m + n - 1 + m - 1))][0]
         
         
    '''....If element is NOT in outermost ring ....'''
    ''' Recursion for sub-matrix. &A[1][1] is
    address to next inside sub matrix.'''
    A.pop(0)
    [j.pop(0) for j in A]
    return findK(A, n - 2, m - 2, k - (2 * n + 2 * m - 4))
 
''' Driver code '''
 
a = [[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12 ],
    [ 13, 14, 15, 16, 17, 18 ]]
k = 17
print(findK(a, 3, 6, k))
 
# This code is contributed by shivanisinghss2110




// C# program for Kth element in spiral
// form of matrix
using System;
class GFG
{
 
  /* function for Kth element */
  static int findK(int[,] A, int i, int j,
                   int n, int m, int k)
  {
    if (n < 1 || m < 1)
      return -1;
 
    /*.....If element is in outermost ring ....*/
    /* Element is in first row */
    if (k <= m)
      return A[i + 0, j + k - 1];
 
    /* Element is in last column */
    if (k <= (m + n - 1))
      return A[i + (k - m), j + m - 1];
 
    /* Element is in last row */
    if (k <= (m + n - 1 + m - 1))
      return A[i + n - 1, j + m - 1 - (k - (m + n - 1))];
 
    /* Element is in first column */
    if (k <= (m + n - 1 + m - 1 + n - 2))
      return A[i + n - 1 - (k - (m + n - 1 + m - 1)), j + 0];
 
    /*.....If element is NOT in outermost ring ....*/
    /* Recursion for sub-matrix. &A[1][1] is
    address to next inside sub matrix.*/
    return findK(A, i + 1, j + 1, n - 2,
                 m - 2, k - (2 * n + 2 * m - 4));
  }
 
  // Driver code
  static void Main()
  {
    int[,] a = { { 1, 2, 3, 4, 5, 6 },
                { 7, 8, 9, 10, 11, 12 },
                { 13, 14, 15, 16, 17, 18 } };
    int k = 17;
    Console.WriteLine(findK(a, 0, 0, 3, 6, k));
  }
}
 
// This code is contributed by divyesh072019.




<script>
 
// JavaScript program for Kth element in spiral
// form of matrix
let MAX = 100;
 
    /* function for Kth element */
    function findK(A,i,j,n,m,k)
    {
        if (n < 1 || m < 1)
            return -1;
 
        /*.....If element is in outermost ring ....*/
        /* Element is in first row */
        if (k <= m)
            return A[i + 0][j + k - 1];
 
        /* Element is in last column */
        if (k <= (m + n - 1))
            return A[i + (k - m)][j + m - 1];
 
        /* Element is in last row */
        if (k <= (m + n - 1 + m - 1))
            return A[i + n - 1][j + m - 1 - (k - (m + n - 1))];
 
        /* Element is in first column */
        if (k <= (m + n - 1 + m - 1 + n - 2))
            return A[i + n - 1 - (k - (m + n - 1 + m - 1))][j + 0];
 
        /*.....If element is NOT in outermost ring ....*/
        /* Recursion for sub-matrix. &A[1][1] is
    address to next inside sub matrix.*/
        return findK(A, i + 1, j + 1, n - 2,
                    m - 2, k - (2 * n + 2 * m - 4));
    }
 
    /* Driver code */
     
        let a = [[ 1, 2, 3, 4, 5, 6 ],
                    [ 7, 8, 9, 10, 11, 12 ],
                    [ 13, 14, 15, 16, 17, 18 ]];
        let k = 17;
        document.write(findK(a, 0, 0, 3, 6, k));
     
// This code is contributed by sravan kumar
 
</script>

Output
10

Complexity Analysis: 


Article Tags :