Open In App

Print matrix in zig-zag fashion

Given a matrix of 2D array of n rows and m columns. Print this matrix in ZIG-ZAG fashion as shown in figure. 

matrix_zag-zag

Example: 

Input:
{{1, 2, 3}
{4, 5, 6}
{7, 8, 9}}

Output: 1 2 4 7 5 3 6 8 9

Approach:

This approach uses a diagonal traversal technique to print the matrix in a zig-zag pattern. It iterates through the matrix diagonally, switching between incrementing the row and column indices based on the current position. This creates a zig-zag path that covers all elements of the matrix.

Below is the implementation of the above approach:

/* C++ Program to print matrix in Zig-zag pattern*/
#include <iostream>
using namespace std;
#define C 3

// Utility function to print matrix
// in zig-zag form
void zigZagMatrix(int arr[][C], int n, int m)
{
    int row = 0, col = 0;

    // Boolean variable that will true if we
    // need to increment 'row' value otherwise
    // false- if increment 'col' value
    bool row_inc = 0;

    // Print matrix of lower half zig-zag pattern
    int mn = min(m, n);
    for (int len = 1; len <= mn; ++len) {
        for (int i = 0; i < len; ++i) {
            cout << arr[row][col] << " ";

            if (i + 1 == len)
                break;
            // If row_increment value is true
            // increment row and decrement col
            // else decrement row and increment
            // col
            if (row_inc)
                ++row, --col;
            else
                --row, ++col;
        }

        if (len == mn)
            break;

        // Update row or col value according
        // to the last increment
        if (row_inc)
            ++row, row_inc = false;
        else
            ++col, row_inc = true;
    }

    // Update the indexes of row and col variable
    if (row == 0) {
        if (col == m - 1)
            ++row;
        else
            ++col;
        row_inc = 1;
    }
    else {
        if (row == n - 1)
            ++col;
        else
            ++row;
        row_inc = 0;
    }

    // Print the next half zig-zag pattern
    int MAX = max(m, n) - 1;
    for (int len, diag = MAX; diag > 0; --diag) {

        if (diag > mn)
            len = mn;
        else
            len = diag;

        for (int i = 0; i < len; ++i) {
            cout << arr[row][col] << " ";

            if (i + 1 == len)
                break;

            // Update row or col value according
            // to the last increment
            if (row_inc)
                ++row, --col;
            else
                ++col, --row;
        }

        // Update the indexes of row and col variable
        if (row == 0 || col == m - 1) {
            if (col == m - 1)
                ++row;
            else
                ++col;

            row_inc = true;
        }

        else if (col == 0 || row == n - 1) {
            if (row == n - 1)
                ++col;
            else
                ++row;

            row_inc = false;
        }
    }
}

// Driver code
int main()
{
    int matrix[][3] = { { 1, 2, 3 },
                        { 4, 5, 6 },
                        { 7, 8, 9 } };
    zigZagMatrix(matrix, 3, 3);

    return 0;
}
/* Java Program to print matrix in Zig-zag pattern*/
class GFG {
  static final int C = 3;

  // Utility function to print matrix
  // in zig-zag form
  static void zigZagMatrix(int arr[][], int n, int m) {
    int row = 0, col = 0;

    // Boolean variable that will true if we
    // need to increment 'row' value otherwise
    // false- if increment 'col' value
    boolean row_inc = false;

    // Print matrix of lower half zig-zag pattern
    int mn = Math.min(m, n);
    for (int len = 1; len <= mn; ++len) {
      for (int i = 0; i < len; ++i) {
        System.out.print(arr[row][col] + " ");

        if (i + 1 == len)
          break;
        // If row_increment value is true
        // increment row and decrement col
        // else decrement row and increment
        // col
        if (row_inc) {
          ++row;
          --col;
        } else {
          --row;
          ++col;
        }
      }

      if (len == mn)
        break;

      // Update row or col value according
      // to the last increment
      if (row_inc) {
        ++row;
        row_inc = false;
      } else {
        ++col;
        row_inc = true;
      }
    }

    // Update the indexes of row and col variable
    if (row == 0) {
      if (col == m - 1)
        ++row;
      else
        ++col;
      row_inc = true;
    } else {
      if (row == n - 1)
        ++col;
      else
        ++row;
      row_inc = false;
    }

    // Print the next half zig-zag pattern
    int MAX = Math.max(m, n) - 1;
    for (int len, diag = MAX; diag > 0; --diag) {

      if (diag > mn)
        len = mn;
      else
        len = diag;

      for (int i = 0; i < len; ++i) {
        System.out.print(arr[row][col] + " ");

        if (i + 1 == len)
          break;

        // Update row or col value according
        // to the last increment
        if (row_inc) {
          ++row;
          --col;
        } else {
          ++col;
          --row;
        }
      }

      // Update the indexes of row and col variable
      if (row == 0 || col == m - 1) {
        if (col == m - 1)
          ++row;
        else
          ++col;

        row_inc = true;
      }

      else if (col == 0 || row == n - 1) {
        if (row == n - 1)
          ++col;
        else
          ++row;

        row_inc = false;
      }
    }
  }
  // Driver code
  public static void main(String[] args) {
    int matrix[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    zigZagMatrix(matrix, 3, 3);
  }
}
// This code is contributed by Anant Agarwal.
# Program to print matrix in Zig-zag pattern

matrix =[
            [ 1, 2, 3,],
            [ 4, 5, 6 ],
            [ 7, 8, 9 ],
        ]
rows=3
columns=3
  
solution=[[] for i in range(rows+columns-1)]

for i in range(rows):
    for j in range(columns):
        sum=i+j
        if(sum%2 ==0):

            #add at beginning
            solution[sum].insert(0,matrix[i][j])
        else:

            #add at end of the list
            solution[sum].append(matrix[i][j])
        
            
# print the solution as it as
for i in solution:
    for j in i:
        print(j,end=" ")
        

      
// C# Program to print matrix
// in Zig-zag pattern
using System;

class GFG {
    static int C = 3;

    // Utility function to print
    // matrix in zig-zag form
    static void zigZagMatrix(int[, ] arr, int n, int m)
    {
        int row = 0, col = 0;

        // Boolean variable that will
        // true if we need to increment
        // 'row' valueotherwise false-
        // if increment 'col' value
        bool row_inc = false;

        // Print matrix of lower half
        // zig-zag pattern
        int mn = Math.Min(m, n);
        for (int len = 1; len <= mn; ++len) {
                for (int i = 0; i < len; ++i) {

                Console.Write(arr[row, col] + " ");

                if (i + 1 == len)
                    break;

                // If row_increment value is true
                // increment row and decrement col
                // else decrement row and increment
                // col
                if (row_inc) {
                    ++row;
                    --col;
                }
                else {
                    --row;
                    ++col;
                }
            }

            if (len == mn)
                break;

            // Update row or col value
            // according to the last
            // increment
            if (row_inc) {
                    ++row;
                    row_inc = false;
            }
            else {
                ++col;
                row_inc = true;
            }
        }

        // Update the indexes of row
        // and col variable
        if (row == 0) {
            if (col == m - 1)
                ++row;
            else
                ++col;
            row_inc = true;
        }
        else {
            if (row == n - 1)
                ++col;
            else
                ++row;
            row_inc = false;
        }

        // Print the next half
        // zig-zag pattern
        int MAX = Math.Max(m, n) - 1;
        for (int len, diag = MAX; diag > 0; --diag) {

            if (diag > mn)
                    len = mn;
            else
                len = diag;

            for (int i = 0; i < len; ++i) {
                    Console.Write(arr[row, col] + " ");

                if (i + 1 == len)
                    break;

                // Update row or col value
                // according to the last
                // increment
                if (row_inc) {
                        ++row;
                        --col;
                }
                else {
                    ++col;
                    --row;
                }
            }

            // Update the indexes of
            // row and col variable
            if (row == 0 || col == m - 1) {
                if (col == m - 1)
                    ++row;
                else
                    ++col;

                row_inc = true;
            }

            else if (col == 0 || row == n - 1) {
                if (row == n - 1)
                    ++col;
                else
                    ++row;

                row_inc = false;
            }
        }
    }

    // Driver code
    public static void Main()
    {
        int[, ] matrix = { { 1, 2, 3 },
                        { 4, 5, 6 },
                        { 7, 8, 9 } };
        zigZagMatrix(matrix, 3, 3);
    }
}

// This code is contributed by vt_m.
// Javascript Program to print matrix in Zig-zag pattern
var n = 3, m = 3;
var a = [[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]];
var zigZagMatrix=function(arr, n, m)
{
    var row = 0;
    var col = 0;
 
    // Variable that will be 1 if we
    // need to increment 'row' value and 0 otherwise
    // if we need to increment 'col' value
    var row_inc = 0;
 
    // print matrix of lower half zig-zag pattern
    var mn = Math.min(m, n);
    for (var len = 1; len <= mn; ++len) {
        for (var i = 0; i < len; ++i) {
            console.log(arr[row][col]);
            console.log(" ");
 
            if (i + 1 == len)
                break;
            // If row_increment value is true
            // increment row and decrement col
            // else decrement row and increment col
            if (row_inc)
                ++row, --col;
            else
                --row, ++col;
        }
 
        if (len == mn)
            break;
 
        // Update row or col value according
        // to the last increment
        if (row_inc)
            ++row, row_inc = false;
        else
            ++col, row_inc = true;
    }
 
    // Update the indexes of row and col variable
    if (row == 0) {
        if (col == m - 1)
            ++row;
        else
            ++col;
        row_inc = 1;
    }
    else {
        if (row == n - 1)
            ++col;
        else
            ++row;
        row_inc = 0;
    }
 
    // Print the next half zig-zag pattern
    var MAX = Math.max(m, n) - 1;
    for (var len, diag = MAX; diag > 0; --diag) {
 
        if (diag > mn)
            len = mn;
        else
            len = diag;
 
        for (var i = 0; i < len; ++i) {
            console.log(arr[row][col]);
            console.log(" ");
            if (i + 1 == len)
                break;
 
            // Update row or col value according
            // to the last increment
            if (row_inc)
                ++row, --col;
            else
                ++col, --row;
        }
 
        // Update the indexes of row and col variable
        if (row == 0 || col == m - 1) {
            if (col == m - 1)
                ++row;
            else
                ++col;
 
            row_inc = true;
        }
 
        else if (col == 0 || row == n - 1) {
            if (row == n - 1)
                ++col;
            else
                ++row;
            row_inc = false;
        }
    }
}
zigZagMatrix(a, 3, 3);
 
// This code is contributed by Sajal Aggarwal.
<?php
// PHP Program to print 
// matrix in Zig-zag pattern
$C = 3;

// Utility function 
// to print matrix
// in zig-zag form
function zigZagMatrix($arr,
                      $n, $m)
{
    $row = 0; $col = 0;

    // Boolean variable that
    // will true if we need 
    // to increment 'row' 
    // value otherwise false-
    // if increment 'col' value
    $row_inc = false;

    // Print matrix of lower
    // half zig-zag pattern
    $mn = min($m, $n);
    for ($len = 1; 
         $len <= $mn; $len++) 
    {
        for ($i = 0; 
             $i < $len; $i++) 
        {
            echo ($arr[$row][$col]." ");

            if ($i + 1 == $len)
                break;
                
            // If row_increment value 
            // is true increment row 
            // and decrement col else 
            // decrement row and 
            // increment col
            if ($row_inc)
            {
                $row++; $col--;
            }
            else
            {
                $row--; $col++;
            }
        }

        if ($len == $mn)
            break;

        // Update row or col
        // value according
        // to the last increment
        if ($row_inc) 
        {
            ++$row; $row_inc = false;
        }
        else 
        {
            ++$col; $row_inc = true;
        }
    }

    // Update the indexes of
    // row and col variable
    if ($row == 0) 
    {
        if ($col == $m - 1)
            ++$row;
        else
            ++$col;
        $row_inc = 1;
    }
    else 
    {
        if ($row == $n - 1)
            ++$col;
        else
            ++$row;
        $row_inc = 0;
    }

    // Print the next half
    // zig-zag pattern
    $MAX = max($m, $n) - 1;
    for ($len, $diag = $MAX;
         $diag > 0; --$diag) 
    {
        if ($diag > $mn)
            $len = $mn;
        else
            $len = $diag;

        for ($i = 0; 
             $i < $len; ++$i)
        {
            echo($arr[$row][$col] . " ");

            if ($i + 1 == $len)
                break;

            // Update row or col 
            // value according to
            // the last increment
            if ($row_inc)
            {
                ++$row; --$col;
            }
            else
            {
                ++$col; --$row;
            }
        }

        // Update the indexes of
        // row and col variable
        if ($row == 0 || 
            $col == $m - 1) 
        {
            if ($col == $m - 1)
                ++$row;
            else
                ++$col;

            $row_inc = true;
        }

        else if ($col == 0 || 
                 $row == $n - 1) 
        {
            if ($row == $n - 1)
                ++$col;
            else
                ++$row;

            $row_inc = false;
        }
    }
}

// Driver code
$matrix = array(array(1, 2, 3),
                array(4, 5, 6),
                array(7, 8, 9));
                
zigZagMatrix($matrix, 3, 3);

// This code is contributed by 
// Manish Shaw(manishshaw1)
?>

Output
1 2 4 7 5 3 6 8 9 

Time complexity: O(n*m)
Auxiliary space: O(1), since no extra space has been taken.

Article Tags :