Imprimir una array dada en forma de espiral – Part 1

Dada una array 2D, imprímala en forma de espiral. Vea los siguientes ejemplos.

Ejemplos: 

C++

#include <bits/stdc++.h>
using namespace std;
  
vector<int> spiralOrder(vector<vector<int> >& matrix)
{
    int m = matrix.size(), n = matrix[0].size();
    vector<int> ans;
  
    if (m == 0)
        return ans;
  
    vector<vector<bool> > seen(m, vector<bool>(n, false));
    int dr[] = { 0, 1, 0, -1 };
    int dc[] = { 1, 0, -1, 0 };
  
    int x = 0, y = 0, di = 0;
  
    // Iterate from 0 to m * n - 1
    for (int i = 0; i < m * n; i++) {
        ans.push_back(matrix[x][y]);
        // on normal geeksforgeeks ui page it is showing
        // 'ans.push_back(matrix[x])' which gets copied as
        // this only and gives error on compilation,
        seen[x][y] = true;
        int newX = x + dr[di];
        int newY = y + dc[di];
  
        if (0 <= newX && newX < m && 0 <= newY && newY < n
            && !seen[newX][newY]) {
            x = newX;
            y = newY;
        }
        else {
            di = (di + 1) % 4;
            x += dr[di];
            y += dc[di];
        }
    }
    return ans;
}
  
// Driver code
int main()
{
    vector<vector<int> > a{ { 1, 2, 3, 4 },
                            { 5, 6, 7, 8 },
                            { 9, 10, 11, 12 },
                            { 13, 14, 15, 16 } };
  
    for (int x : spiralOrder(a)) {
        cout << x << " ";
    }
    return 0;
}
  
// This code is contributed by Yashvendra Singh

Java

// Java program for the above approach
import java.util.*;
  
class Solution {
  
    // Function to print in spiral order
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<Integer>();
  
        if (matrix.length == 0)
            return ans;
  
        int m = matrix.length, n = matrix[0].length;
        boolean[][] seen = new boolean[m][n];
        int[] dr = { 0, 1, 0, -1 };
        int[] dc = { 1, 0, -1, 0 };
        int x = 0, y = 0, di = 0;
  
        // Iterate from 0 to R * C - 1
        for (int i = 0; i < m * n; i++) {
            ans.add(matrix[x][y]);
            seen[x][y] = true;
            int cr = x + dr[di];
            int cc = y + dc[di];
  
            if (0 <= cr && cr < m && 0 <= cc && cc < n
                    && !seen[cr][cc]) {
                x = cr;
                y = cc;
            } else {
                di = (di + 1) % 4;
                x += dr[di];
                y += dc[di];
            }
        }
        return ans;
    }
  
    // 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 } };
  
        System.out.println(spiralOrder(a));
    }
}

Python3

def spiralOrder(matrix):
    ans = []
  
    if (len(matrix) == 0):
        return ans
  
    m = len(matrix)
    n = len(matrix[0])
    seen = [[0 for i in range(n)] for j in range(m)]
    dr = [0, 1, 0, -1]
    dc = [1, 0, -1, 0]
    x = 0
    y = 0
    di = 0
  
    # Iterate from 0 to R * C - 1
    for i in range(m * n):
        ans.append(matrix[x][y])
        seen[x][y] = True
        cr = x + dr[di]
        cc = y + dc[di]
  
        if (0 <= cr and cr < m and 0 <= cc and cc < n and not(seen[cr][cc])):
            x = cr
            y = cc
        else:
            di = (di + 1) % 4
            x += dr[di]
            y += dc[di]
    return ans
  
  
# Driver code
a = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
  
for x in spiralOrder(a):
    print(x, end=" ")
print()

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
  
public class GFG {
  
    // Function to print in spiral order
    public static List<int> spiralOrder(int[,] matrix)
    {
        List<int> ans = new List<int>();
  
        if (matrix.Length == 0)
            return ans;
  
        int R = matrix.GetLength(0), C = matrix.GetLength(1);
        bool[,] seen = new bool[R,C];
        int[] dr = { 0, 1, 0, -1 };
        int[] dc = { 1, 0, -1, 0 };
        int r = 0, c = 0, di = 0;
  
        // Iterate from 0 to R * C - 1
        for (int i = 0; i < R * C; i++) {
            ans.Add(matrix[r,c]);
            seen[r,c] = true;
            int cr = r + dr[di];
            int cc = c + dc[di];
  
            if (0 <= cr && cr < R && 0 <= cc && cc < C
                && !seen[cr,cc]) {
                r = cr;
                c = cc;
            }
            else {
                di = (di + 1) % 4;
                r += dr[di];
                c += dc[di];
            }
        }
        return ans;
    }
  
    // 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 } };
  
        spiralOrder(a).ForEach(i=>Console.Write(i+" "));
    }
}
  
// This code is contributed by 29AjayKumar

Javascript

<script>
  
// JavaScript program for the above approach
  
// Function to print in spiral order
function spiralOrder(matrix)
{
    let ans = [];
   
        if (matrix.length == 0)
            return ans;
   
        let R = matrix.length, C = matrix[0].length;
        let seen = new Array(R);
        for(let i=0;i<R;i++)
        {
            seen[i]=new Array(C);
            for(let j=0;j<C;j++)
            {
                seen[i][j]=false;
            }
        }
          
        let dr = [ 0, 1, 0, -1 ];
        let dc = [ 1, 0, -1, 0 ];
        let r = 0, c = 0, di = 0;
   
        // Iterate from 0 to R * C - 1
        for (let i = 0; i < R * C; i++) {
            ans.push(matrix[r]);
            seen[r] = true;
            let cr = r + dr[di];
            let cc = c + dc[di];
   
            if (0 <= cr && cr < R && 0 <= cc && cc < C
                && !seen[cr][cc]) {
                r = cr;
                c = cc;
            }
            else {
                di = (di + 1) % 4;
                r += dr[di];
                c += dc[di];
            }
        }
        return ans;
}
  
// Driver Code
let a=[[ 1, 2, 3, 4 ],[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],[ 13, 14, 15, 16 ]];
document.write(spiralOrder(a));
                        
  
  
// This code is contributed by unknown2108
  
</script>

C++

// C++ Program to print a matrix spirally
  
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
  
void spiralPrint(int m, int n, int a[R][C])
{
    int i, k = 0, l = 0;
  
    /* k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator
    */
  
    while (k < m && l < n) {
        /* Print the first row from
               the remaining rows */
        for (i = l; i < n; ++i) {
            cout << a[k][i] << " ";
        }
        k++;
  
        /* Print the last column
         from the remaining columns */
        for (i = k; i < m; ++i) {
            cout << a[i][n - 1] << " ";
        }
        n--;
  
        /* Print the last row from
                the remaining rows */
        if (k < m) {
            for (i = n - 1; i >= l; --i) {
                cout << a[m - 1][i] << " ";
            }
            m--;
        }
  
        /* Print the first column from
                   the remaining columns */
        if (l < n) {
            for (i = m - 1; i >= k; --i) {
                cout << a[i][l] << " ";
            }
            l++;
        }
    }
}
  
/* Driver Code */
int main()
{
    int a[R][C] = {{1, 2, 3, 4},
                   {5, 6, 7, 8},
                   {9, 10, 11, 12},
                   {13, 14, 15, 16}};
  
    // Function Call
    spiralPrint(R, C, a);
    return 0;
}
  
// This is code is contributed by rathbhupendra

C

// C program to print the array in a
// spiral form
  
#include <stdio.h>
#define R 4
#define C 4
  
void spiralPrint(int m, int n, int a[R][C])
{
    int i, k = 0, l = 0;
  
    /*  k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator
    */
  
    while (k < m && l < n) {
        /* Print the first row from the remaining rows */
        for (i = l; i < n; ++i) {
            printf("%d ", a[k][i]);
        }
        k++;
  
        /* Print the last column from the remaining columns
         */
        for (i = k; i < m; ++i) {
            printf("%d ", a[i][n - 1]);
        }
        n--;
  
        /* Print the last row from the remaining rows */
        if (k < m) {
            for (i = n - 1; i >= l; --i) {
                printf("%d ", a[m - 1][i]);
            }
            m--;
        }
  
        /* Print the first column from the remaining columns
         */
        if (l < n) {
            for (i = m - 1; i >= k; --i) {
                printf("%d ", a[i][l]);
            }
            l++;
        }
    }
}
  
/* Driver Code */
int main()
{
    int a[R][C] =  {{1, 2, 3, 4},
                   {5, 6, 7, 8},
                   {9, 10, 11, 12},
                   {13, 14, 15, 16}};
  
    // Function Call
    spiralPrint(R, C, a);
    return 0;
}

Java

// Java program to print a given matrix in spiral form
import java.io.*;
  
class GFG {
  
    // Function print matrix in spiral form
    static void spiralPrint(int m, int n, int a[][])
    {
        int i, k = 0, l = 0;
  
        /*  k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator
        */
  
        while (k < m && l < n) {
            // Print the first row from the remaining rows
            for (i = l; i < n; ++i) {
                System.out.print(a[k][i] + " ");
            }
            k++;
  
            // Print the last column from the remaining
            // columns
            for (i = k; i < m; ++i) {
                System.out.print(a[i][n - 1] + " ");
            }
            n--;
  
            // Print the last row from the remaining rows */
            if (k < m) {
                for (i = n - 1; i >= l; --i) {
                    System.out.print(a[m - 1][i] + " ");
                }
                m--;
            }
  
            // Print the first column from the remaining
            // columns */
            if (l < n) {
                for (i = m - 1; i >= k; --i) {
                    System.out.print(a[i][l] + " ");
                }
                l++;
            }
        }
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int R = 4;
        int C = 4;
        int a[][] =  {{1, 2, 3, 4},
                   {5, 6, 7, 8},
                   {9, 10, 11, 12},
                   {13, 14, 15, 16}};
  
        // Function Call
        spiralPrint(R, C, a);
    }
}
  
// Contributed by Pramod Kumar

Python3

# Python3 program to print
# given matrix in spiral form
  
  
def spiralPrint(m, n, a):
    k = 0
    l = 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):
  
        # Print the first row from
        # the remaining rows
        for i in range(l, n):
            print(a[k][i], end=" ")
  
        k += 1
  
        # Print the last column from
        # the remaining columns
        for i in range(k, m):
            print(a[i][n - 1], end=" ")
  
        n -= 1
  
        # Print the last row from
        # the remaining rows
        if (k < m):
  
            for i in range(n - 1, (l - 1), -1):
                print(a[m - 1][i], end=" ")
  
            m -= 1
  
        # Print the first column from
        # the remaining columns
        if (l < n):
            for i in range(m - 1, k - 1, -1):
                print(a[i][l], end=" ")
  
            l += 1
  
  
# Driver Code
a = [[ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ],
     [ 9, 10, 11, 12 ],
     [ 13, 14, 15, 16 ]]
  
R = 4
C = 4
  
# Function Call
spiralPrint(R, C, a)
  
# This code is contributed by Nikita Tiwari.

C#

// C# program to print a given
// matrix in spiral form
using System;
  
class GFG {
    // Function print matrix in spiral form
    static void spiralPrint(int m, int n, int[, ] a)
    {
        int i, k = 0, l = 0;
        /* k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator
        */
  
        while (k < m && l < n) {
            // Print the first row
            // from the remaining rows
            for (i = l; i < n; ++i) {
                Console.Write(a[k, i] + " ");
            }
            k++;
  
            // Print the last column from the
            // remaining columns
            for (i = k; i < m; ++i) {
                Console.Write(a[i, n - 1] + " ");
            }
            n--;
  
            // Print the last row from
            // the remaining rows
            if (k < m) {
                for (i = n - 1; i >= l; --i) {
                    Console.Write(a[m - 1, i] + " ");
                }
                m--;
            }
  
            // Print the first column from
            // the remaining columns
            if (l < n) {
                for (i = m - 1; i >= k; --i) {
                    Console.Write(a[i, l] + " ");
                }
                l++;
            }
        }
    }
  
    // Driver Code
    public static void Main()
    {
        int R = 4;
        int C = 4;
        int[, ] a =  {{1, 2, 3, 4},
                   {5, 6, 7, 8},
                   {9, 10, 11, 12},
                   {13, 14, 15, 16}};
  
        // Function Call
        spiralPrint(R, C, a);
    }
}
  
// This code is contributed by Sam007

PHP

<?php 
// PHP program to print a given
// matrix in spiral form
$R = 4;
$C = 4;
  
function spiralPrint($m, $n, &$a)
{
    $k = 0;
    $l = 0;
  
    /* $k - starting row index
        $m - ending row index
        $l - starting column index
        $n - ending column index
        $i - iterator
    */
  
    while ($k < $m && $l < $n)
    {
        /* Print the first row from
           the remaining rows */
        for ($i = $l; $i < $n; ++$i)
        {
            echo $a[$k][$i] . " ";
        }
        $k++;
  
        /* Print the last column 
        from the remaining columns */
        for ($i = $k; $i < $m; ++$i)
        {
            echo $a[$i][$n - 1] . " ";
        }
        $n--;
  
        /* Print the last row from
           the remaining rows */
        if ($k < $m)
        {
            for ($i = $n - 1; $i >= $l; --$i)
            {
                echo $a[$m - 1][$i] . " ";
            }
            $m--;
        }
  
        /* Print the first column from
           the remaining columns */
        if ($l < $n)
        {
            for ($i = $m - 1; $i >= $k; --$i)
            {
                echo $a[$i][$l] . " ";
            }
            $l++; 
        }     
    }
}
  
// Driver code
$a = array(array(1, 2, 3, 4),
           array(5, 6, 7, 8),
           array(9, 10, 11, 12),
           array(13, 14, 15, 16));
// Function Call
spiralPrint($R, $C, $a);
  
// This code is contributed
// by ChitraNayal
?>

Javascript

<script>
  
// JavaScript Program to print a matrix spirally
  
function spiralPrint(m, n, arr) {
    let i, k = 0, l = 0;
    /*
        k - starting row index
        m - ending row index
        l - starting column index
        n - ending column index
        i - iterator  
    */
  
    while (k < m && l < n) {
        // print the first row from the remaining rows
        for (i = l; i < n; ++i) {
            document.write(arr[k][i] + ' ');
        }
        k++;
  
        // print the last column from the remaining columns
        for (i = k; i < m; ++i) {
            document.write(arr[i][n - 1] + ' ');
        }
        n--;
  
        // print the last row from the remaining rows
        if (k < m) {
            for (i = n - 1; i >= l; --i) {
                document.write(arr[m - 1][i] + ' ');
            }
            m--;
        }
  
        // print the first column from the remaining columns
        if (l < n) {
            for (i = m - 1; i >= k; --i) {
                document.write(arr[i][l] + ' ');
            }
            l++;
        }
    }
}
  
// function call
let arr = [[ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ],
     [ 9, 10, 11, 12 ],
     [ 13, 14, 15, 16 ]];
let r = arr.length;
let c = arr[0].length;
  
spiralPrint(r, c, arr);
  
// This code is contributed by karthiksrinivasprasad
  
</script>

C++

// C++. program for the above approach
#include <iostream>
using namespace std;
  
#define R 4
#define C 4
  
// Function for printing matrix in spiral
// form i, j: Start index of matrix, row
// and column respectively m, n: End index
// of matrix row and column respectively
void print(int arr[R][C], int i, int j, int m, int n)
{
    // If i or j lies outside the matrix
    if (i >= m or j >= n)
        return;
  
    // Print First Row
    for (int p = j; p < n; p++)
        cout << arr[i][p] << " ";
  
    // Print Last Column
    for (int p = i + 1; p < m; p++)
        cout << arr[p][n - 1] << " ";
  
    // Print Last Row, if Last and
    // First Row are not same
    if ((m - 1) != i)
        for (int p = n - 2; p >= j; p--)
            cout << arr[m - 1][p] << " ";
  
    // Print First Column,  if Last and
    // First Column are not same
    if ((n - 1) != j)
        for (int p = m - 2; p > i; p--)
            cout << arr[p][j] << " ";
  
    print(arr, i + 1, j + 1, m - 1, n - 1);
}
  
// Driver Code
int main()
{
  
    int a[R][C] = { { 1, 2, 3, 4 },
                    { 5, 6, 7, 8 },
                    { 9, 10, 11, 12 },
                    { 13, 14, 15, 16 } };
  
    // Function Call
    print(a, 0, 0, R, C);
    return 0;
}
// This Code is contributed by Ankur Goel

Java

// Java program for the above approach
import java.util.*;
  
class GFG {
    static int R = 4;
    static int C = 4;
  
    // Function for printing matrix in spiral
    // form i, j: Start index of matrix, row
    // and column respectively m, n: End index
    // of matrix row and column respectively
    static void print(int arr[][], int i, int j, int m,
                      int n)
    {
        // If i or j lies outside the matrix
        if (i >= m || j >= n) {
            return;
        }
  
        // Print First Row
        for (int p = i; p < n; p++) {
            System.out.print(arr[i][p] + " ");
        }
  
        // Print Last Column
        for (int p = i + 1; p < m; p++) {
            System.out.print(arr[p][n - 1] + " ");
        }
  
        // Print Last Row, if Last and
        // First Row are not same
        if ((m - 1) != i) {
            for (int p = n - 2; p >= j; p--) {
                System.out.print(arr[m - 1][p] + " ");
            }
        }
  
        // Print First Column, if Last and
        // First Column are not same
        if ((n - 1) != j) {
            for (int p = m - 2; p > i; p--) {
                System.out.print(arr[p][j] + " ");
            }
        }
        print(arr, i + 1, j + 1, m - 1, n - 1);
    }
  
    // 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 } };
  
        // Function Call
        print(a, 0, 0, R, C);
    }
}
  
// This code is contributed by 29AjayKumar

Python3

# Python3 program for the above approach
  
# Function for printing matrix in spiral
# form i, j: Start index of matrix, row
# and column respectively m, n: End index
# of matrix row and column respectively
  
  
def printdata(arr, i, j, m, n):
  
    # If i or j lies outside the matrix
    if (i >= m or j >= n):
        return
  
    # Print First Row
    for p in range(i, n):
        print(arr[i][p], end=" ")
  
    # Print Last Column
    for p in range(i + 1, m):
        print(arr[p][n - 1], end=" ")
  
    # Print Last Row, if Last and
    # First Row are not same
    if ((m - 1) != i):
        for p in range(n - 2, j - 1, -1):
            print(arr[m - 1][p], end=" ")
  
    # Print First Column, if Last and
    # First Column are not same
    if ((n - 1) != j):
        for p in range(m - 2, i, -1):
            print(arr[p][j], end=" ")
  
    printdata(arr, i + 1, j + 1, m - 1, n - 1)
  
  
# Driver code
R = 4
C = 4
arr = [[1, 2, 3, 4],
       [5, 6, 7, 8],
       [9, 10, 11, 12],
       [13, 14, 15, 16]]
  
# Function Call
printdata(arr, 0, 0, R, C)
  
# This code is contributed by avsadityavardhan

C#

// C# program for the above approach
using System;
  
class GFG {
    static int R = 4;
    static int C = 4;
  
    // Function for printing matrix in spiral
    // form i, j: Start index of matrix, row
    // and column respectively m, n: End index
    // of matrix row and column respectively
    static void print(int[, ] arr, int i, int j, int m,
                      int n)
    {
        // If i or j lies outside the matrix
        if (i >= m || j >= n) {
            return;
        }
  
        // Print First Row
        for (int p = i; p < n; p++) {
            Console.Write(arr[i, p] + " ");
        }
  
        // Print Last Column
        for (int p = i + 1; p < m; p++) {
            Console.Write(arr[p, n - 1] + " ");
        }
  
        // Print Last Row, if Last and
        // First Row are not same
        if ((m - 1) != i) {
            for (int p = n - 2; p >= j; p--) {
                Console.Write(arr[m - 1, p] + " ");
            }
        }
  
        // Print First Column, if Last and
        // First Column are not same
        if ((n - 1) != j) {
            for (int p = m - 2; p > i; p--) {
                Console.Write(arr[p, j] + " ");
            }
        }
        print(arr, i + 1, j + 1, m - 1, n - 1);
    }
  
    // 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 } };
        // Function Call
        print(a, 0, 0, R, C);
    }
}
  
// This code is contributed by Princi Singh

Javascript

<script>
// JavaScript program for the above approach
  
// Function for printing matrix in spiral
// form i, j: Start index of matrix, row
// and column respectively m, n: End index
// of matrix row and column respectively
  
function print(arr, i, j, m, n) {
  
    // If i or j lies outside the matrix
    if (i >= m || j >= n) return;
  
    // Print First Row
    for (let p = j; p < n; p++) {
        document.write(arr[i][p] + ' ')
    }
  
    // Print Last Column
    for (let p = i + 1; p < m; p++) {
        document.write(arr[p][n - 1] + ' ')
    }
  
    // Print Last Row, if Last and
    // First Row are not same
    if ((m - 1) != i) {
        for (let p = n - 2; p >= j; p--) {
            document.write(arr[m - 1][p] + ' ');
        }
    }
  
    // Print First Column, if Last and
    // First Column are not same    
    if ((n - 1) != j) {
        for (let p = m - 2; p > i; p--) {
            document.write(arr[p][j] + ' ');
        }
    }
    print(arr, i + 1, j + 1, m - 1, n - 1)
}
  
// function call
let arr = [ [1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12],
            [13, 14, 15, 16]
           ];
let r = arr.length;
let c = arr[0].length;
  
print(arr, 0, 0, r, c);
  
// This code is contributed by karthiksrinivasprasad
  
</script>

C++

#include <iostream>
#include <vector>
using namespace std;
#define R 4
#define C 4
  
bool isInBounds(int i, int j)
{
    if (i < 0 || i >= R || j < 0 || j >= C)
        return false;
    return true;
}
  
// check if the position is blocked
bool isBlocked(int matrix[R][C], int i, int j)
{
    if (!isInBounds(i, j))
        return true;
    if (matrix[i][j] == -1)
        return true;
    return false;
}
  
// DFS code to traverse spirally
void spirallyDFSTravserse(int matrix[R][C], int i, int j,
                          int dir, vector<int>& res)
{
    if (isBlocked(matrix, i, j))
        return;
    bool allBlocked = true;
    for (int k = -1; k <= 1; k += 2) {
        allBlocked = allBlocked
                     && isBlocked(matrix, k + i, j)
                     && isBlocked(matrix, i, j + k);
    }
    res.push_back(matrix[i][j]);
    matrix[i][j] = -1;
    if (allBlocked) {
        return;
    }
  
    // dir: 0 - right, 1 - down, 2 - left, 3 - up
    int nxt_i = i;
    int nxt_j = j;
    int nxt_dir = dir;
    if (dir == 0) {
        if (!isBlocked(matrix, i, j + 1)) {
            nxt_j++;
        }
        else {
            nxt_dir = 1;
            nxt_i++;
        }
    }
    else if (dir == 1) {
        if (!isBlocked(matrix, i + 1, j)) {
            nxt_i++;
        }
        else {
            nxt_dir = 2;
            nxt_j--;
        }
    }
    else if (dir == 2) {
        if (!isBlocked(matrix, i, j - 1)) {
            nxt_j--;
        }
        else {
            nxt_dir = 3;
            nxt_i--;
        }
    }
    else if (dir == 3) {
        if (!isBlocked(matrix, i - 1, j)) {
            nxt_i--;
        }
        else {
            nxt_dir = 0;
            nxt_j++;
        }
    }
    spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,
                         res);
}
  
// to traverse spirally
vector<int> spirallyTraverse(int matrix[R][C])
{
    vector<int> res;
    spirallyDFSTravserse(matrix, 0, 0, 0, res);
    return res;
}
  
// Driver Code
int main()
{
    int a[R][C] = { { 1, 2, 3, 4 },
                    { 5, 6, 7, 8 },
                    { 9, 10, 11, 12 },
                    { 13, 14, 15, 16 } };
  
    // Function Call
    vector<int> res = spirallyTraverse(a);
    int size = res.size();
    for (int i = 0; i < size; ++i)
        cout << res[i] << " ";
    cout << endl;
    return 0;
} // code contributed by Ephi F

Java

import java.io.*;
import java.util.*;
  
class GFG {
    public static int R = 4, C = 4;
    public static boolean isInBounds(int i, int j)
    {
        if (i < 0 || i >= R || j < 0 || j >= C)
            return false;
        return true;
    }
  
    // check if the position is blocked
    public static boolean isBlocked(int[][] matrix, int i,
                                    int j)
    {
        if (!isInBounds(i, j))
            return true;
        if (matrix[i][j] == -1)
            return true;
        return false;
    }
  
    // DFS code to traverse spirally
    public static void
    spirallyDFSTravserse(int[][] matrix, int i, int j,
                         int dir, ArrayList<Integer> res)
    {
        if (isBlocked(matrix, i, j))
            return;
        boolean allBlocked = true;
        for (int k = -1; k <= 1; k += 2) {
            allBlocked = allBlocked
                         && isBlocked(matrix, k + i, j)
                         && isBlocked(matrix, i, j + k);
        }
        res.add(matrix[i][j]);
        matrix[i][j] = -1;
        if (allBlocked) {
            return;
        }
  
        // dir: 0 - right, 1 - down, 2 - left, 3 - up
        int nxt_i = i;
        int nxt_j = j;
        int nxt_dir = dir;
        if (dir == 0) {
            if (!isBlocked(matrix, i, j + 1)) {
                nxt_j++;
            }
            else {
                nxt_dir = 1;
                nxt_i++;
            }
        }
        else if (dir == 1) {
            if (!isBlocked(matrix, i + 1, j)) {
                nxt_i++;
            }
            else {
                nxt_dir = 2;
                nxt_j--;
            }
        }
        else if (dir == 2) {
            if (!isBlocked(matrix, i, j - 1)) {
                nxt_j--;
            }
            else {
                nxt_dir = 3;
                nxt_i--;
            }
        }
        else if (dir == 3) {
            if (!isBlocked(matrix, i - 1, j)) {
                nxt_i--;
            }
            else {
                nxt_dir = 0;
                nxt_j++;
            }
        }
        spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,
                             res);
    }
  
    // to traverse spirally
    public static ArrayList<Integer>
    spirallyTraverse(int[][] matrix)
    {
        ArrayList<Integer> res = new ArrayList<Integer>();
        spirallyDFSTravserse(matrix, 0, 0, 0, res);
        return res;
    }
  
    // 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 } };
  
        // Function Call
        ArrayList<Integer> res = spirallyTraverse(a);
        int size = res.size();
        for (int i = 0; i < size; ++i)
            System.out.print(res.get(i) + " ");
        System.out.println();
    }
}
  
// This code is contributed by Manu Pathria

Python3

R = 4
C = 4
  
  
def isInBounds(i, j):
    global R
    global C
    if (i < 0 or i >= R or j < 0 or j >= C):
        return False
    return True
  
# Check if the position is blocked
  
  
def isBlocked(matrix, i, j):
    if (not isInBounds(i, j)):
        return True
    if (matrix[i][j] == -1):
        return True
  
    return False
  
# DFS code to traverse spirally
  
  
def spirallyDFSTravserse(matrix, i, j, Dir, res):
    if (isBlocked(matrix, i, j)):
        return
  
    allBlocked = True
    for k in range(-1, 2, 2):
        allBlocked = allBlocked and isBlocked(
            matrix, k + i, j) and isBlocked(matrix, i, j + k)
  
    res.append(matrix[i][j])
    matrix[i][j] = -1
    if (allBlocked):
        return
  
    # dir: 0 - right, 1 - down, 2 - left, 3 - up
    nxt_i = i
    nxt_j = j
    nxt_dir = Dir
    if (Dir == 0):
        if (not isBlocked(matrix, i, j + 1)):
            nxt_j += 1
        else:
            nxt_dir = 1
            nxt_i += 1
  
    elif(Dir == 1):
        if (not isBlocked(matrix, i + 1, j)):
            nxt_i += 1
        else:
            nxt_dir = 2
            nxt_j -= 1
  
    elif(Dir == 2):
        if (not isBlocked(matrix, i, j - 1)):
            nxt_j -= 1
        else:
            nxt_dir = 3
            nxt_i -= 1
  
    elif(Dir == 3):
        if (not isBlocked(matrix, i - 1, j)):
            nxt_i -= 1
        else:
            nxt_dir = 0
            nxt_j += 1
  
    spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir, res)
  
# To traverse spirally
  
  
def spirallyTraverse(matrix):
    res = []
    spirallyDFSTravserse(matrix, 0, 0, 0, res)
    return res
  
  
# Driver code
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
  
# Function Call
res = spirallyTraverse(a)
print(*res)
  
# This code is contributed by rag2127

C#

using System;
using System.Collections.Generic;
  
class GFG {
  
    public static int R = 4, C = 4;
    public static bool isInBounds(int i, int j)
    {
        if (i < 0 || i >= R || j < 0 || j >= C)
            return false;
  
        return true;
    }
  
    // Check if the position is blocked
    public static bool isBlocked(int[, ] matrix, int i,
                                 int j)
    {
        if (!isInBounds(i, j))
            return true;
        if (matrix[i, j] == -1)
            return true;
        return false;
    }
  
    // DFS code to traverse spirally
    public static void spirallyDFSTravserse(int[, ] matrix,
                                            int i, int j,
                                            int dir,
                                            List<int> res)
    {
        if (isBlocked(matrix, i, j))
            return;
  
        bool allBlocked = true;
  
        for (int k = -1; k <= 1; k += 2) {
            allBlocked = allBlocked
                         && isBlocked(matrix, k + i, j)
                         && isBlocked(matrix, i, j + k);
        }
        res.Add(matrix[i, j]);
        matrix[i, j] = -1;
  
        if (allBlocked) {
            return;
        }
  
        // dir: 0 - right, 1 - down, 2 - left, 3 - up
        int nxt_i = i;
        int nxt_j = j;
        int nxt_dir = dir;
        if (dir == 0) {
            if (!isBlocked(matrix, i, j + 1)) {
                nxt_j++;
            }
            else {
                nxt_dir = 1;
                nxt_i++;
            }
        }
        else if (dir == 1) {
            if (!isBlocked(matrix, i + 1, j)) {
                nxt_i++;
            }
            else {
                nxt_dir = 2;
                nxt_j--;
            }
        }
        else if (dir == 2) {
            if (!isBlocked(matrix, i, j - 1)) {
                nxt_j--;
            }
            else {
                nxt_dir = 3;
                nxt_i--;
            }
        }
        else if (dir == 3) {
            if (!isBlocked(matrix, i - 1, j)) {
                nxt_i--;
            }
            else {
                nxt_dir = 0;
                nxt_j++;
            }
        }
        spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,
                             res);
    }
  
    // To traverse spirally
    public static List<int> spirallyTraverse(int[, ] matrix)
    {
        List<int> res = new List<int>();
        spirallyDFSTravserse(matrix, 0, 0, 0, res);
        return res;
    }
  
    // Driver code
    static public void Main()
    {
        int[, ] a = { { 1, 2, 3, 4 },
                      { 5, 6, 7, 8 },
                      { 9, 10, 11, 12 },
                      { 13, 14, 15, 16 } };
  
        // Function Call
        List<int> res = spirallyTraverse(a);
        int size = res.Count;
  
        for (int i = 0; i < size; ++i)
            Console.Write(res[i] + " ");
  
        Console.WriteLine();
    }
}
  
// This code is contributed by avanitrachhadiya2155

Javascript

<script>
  
var R = 4, C = 4;
function isInBounds(i, j)
{
    if (i < 0 || i >= R || j < 0 || j >= C)
        return false;
    return true;
}
// Check if the position is blocked
function isBlocked(matrix, i, j)
{
    if (!isInBounds(i, j))
        return true;
    if (matrix[i][j] == -1)
        return true;
    return false;
}
// DFS code to traverse spirally
function spirallyDFSTravserse(matrix, i, j, dir, res)
{
    if (isBlocked(matrix, i, j))
        return;
    var allBlocked = true;
    for (var k = -1; k <= 1; k += 2) {
        allBlocked = allBlocked
                     && isBlocked(matrix, k + i, j)
                     && isBlocked(matrix, i, j + k);
    }
    res.push(matrix[i][j]);
    matrix[i][j] = -1;
    if (allBlocked) {
        return;
    }
    // dir: 0 - right, 1 - down, 2 - left, 3 - up
    var nxt_i = i;
    var nxt_j = j;
    var nxt_dir = dir;
    if (dir == 0) {
        if (!isBlocked(matrix, i, j + 1)) {
            nxt_j++;
        }
        else {
            nxt_dir = 1;
            nxt_i++;
        }
    }
    else if (dir == 1) {
        if (!isBlocked(matrix, i + 1, j)) {
            nxt_i++;
        }
        else {
            nxt_dir = 2;
            nxt_j--;
        }
    }
    else if (dir == 2) {
        if (!isBlocked(matrix, i, j - 1)) {
            nxt_j--;
        }
        else {
            nxt_dir = 3;
            nxt_i--;
        }
    }
    else if (dir == 3) {
        if (!isBlocked(matrix, i - 1, j)) {
            nxt_i--;
        }
        else {
            nxt_dir = 0;
            nxt_j++;
        }
    }
    spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,
                         res);
}
// To traverse spirally
function spirallyTraverse(matrix)
{
    var res = [];
    spirallyDFSTravserse(matrix, 0, 0, 0, res);
    return res;
}
// Driver code
var a = [ [ 1, 2, 3, 4 ],
              [ 5, 6, 7, 8 ],
              [ 9, 10, 11, 12 ],
              [ 13, 14, 15, 16 ]];
// Function Call
var res = spirallyTraverse(a);
var size = res.length;
for (var i = 0; i < size; ++i)
    document.write(res[i] + " ");
  
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *