Programa en C para rotar una matriz a la izquierda y a la derecha por un número dado K

Programa en C para rotar una matriz a la izquierda y a la derecha por un número dado K

En esta publicación de blog, aprendemos cómo escribir un programa en C para rotar una matriz a la izquierda y a la derecha por un número K dado. Así que aquí escribiremos un programa en C para rotar una matriz a la izquierda y a la derecha un número K dado.

Suponga que 'arr' es una matriz de enteros de tamaño N y tiene la tarea de rotar la matriz hacia la izquierda o hacia la derecha en k pasos, donde k no es negativo. Aquí, la rotación de la matriz significa desplazar los elementos de la matriz hacia la izquierda o hacia la derecha de la matriz en posiciones específicas.

Ejemplo,

Input: int arr[] = {1,2,3,4,5,6,7}, k = 3

Output: {5,6,7,1,2,3,4}

Explanation:

rotate 1 steps to the right-> {7,1,2,3,4,5,6}
rotate 2 steps to the right-> {6,7,1,2,3,4,5}
rotate 3 steps to the right-> {5,6,7,1,2,3,4}

Veamos alguna solución para rotar una matriz a la izquierda y a la derecha un número K dado. Pero sería genial si intentaras resolver este problema tú mismo primero.

Solución 1:

En esta solución, primero, crearemos dos funciones para desplazar el elemento de matriz una posición hacia la izquierda y hacia la derecha. Después de crear estas dos funciones, las llamamos en otras funciones donde serán llamadas en el bucle de acuerdo con el valor de 'k'.

En la función de desplazamiento a la izquierda, crearemos una variable temporal intermedia para almacenar la matriz del primer elemento ( arr[0] ). Ahora moveremos arr[1] a arr[0], arr[2] a arr[1]... y finalmente temp a arr[n-1]. Esta técnica rotará la posición del elemento de matriz 1.

En el desplazamiento a la derecha, necesitamos almacenar el último elemento de la matriz en la variable temporal y mover arr[n-2] a arr[n-1], arr[n-3] a arr[n-2]… y finalmente temp to arr[0].

Si desea obtener más información sobre el lenguaje C, puede consultar este curso, Prueba gratuita disponible.

Obtenga su prueba gratuita

Veamos el programa c para girar a la izquierda y a la derecha los elementos del arreglo en la k-ésima posición.

#include <stdio.h>
#include <stdint.h>

//Calculate array size
#define ARRAY_SIZE(arr)  sizeof(arr)/sizeof(arr[0])


// Function to right-rotate an array by one position
void rightRotateByOne(int arr[], int arr_size)
{
    int i;
    //take last element of the array
    int last = arr[arr_size - 1];
    for (i = arr_size - 2; i >= 0; i--)
    {
        arr[i + 1] = arr[i];
    }
    // Now store the last element
    // at 0th index of the array
    arr[0] = last;
}

// Function to left-rotate an array by one position
void leftRotatebyOne(int arr[], int arr_size)
{
    //get first element of the array
    int first = arr[0], i;
    for (i = 0; i < arr_size - 1; i++)
    {
        arr[i] = arr[i + 1];
    }

    arr[i] = first;
}


//Function to left rotate an array by 'k' positions
void leftRotate(int arr[], int k, int arr_size)
{
    int i;
    for (i = 0; i < k; i++)
    {
        leftRotatebyOne(arr, arr_size);
    }
}


// Function to right-rotate an array by 'k' positions
void rightRotate(int arr[], int k, int arr_size)
{
    int i;
    for (i = 0; i < k; i++)
    {
        rightRotateByOne(arr, arr_size);
    }
}




//print the array elements
void printArray(int arr[], int arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++)
    {
        printf("%d ", arr[i]);
    }

    printf("\n\n");
}



int main()
{
    //array must be sorted
    int arr[] = {8, 11, 13, 15, 1, 4, 6};

    //get array size
    int arr_size = ARRAY_SIZE(arr);

    printf("Original Array = ");
    printArray(arr, 7);

    printf("Left shift array by 2 = ");
    leftRotate(arr, 2, arr_size);
    printArray(arr, 7);


    printf("Right shift array by 2 = ");
    rightRotate(arr, 2, arr_size);
    printArray(arr, 7);

    return 0;
}

Solución 2 (algoritmo de malabarismo):

En esta solución, además de rotar el elemento uno por uno, rotaremos la matriz en conjuntos. Donde el número de conjuntos es igual a GCD de n (tamaño de la matriz) y K (posición para rotar los elementos de la matriz).

Supongamos que arr es una matriz de enteros y el tamaño es 7, queremos rotarla en 2. Así que aquí n =7 y k =2 y los elementos de la matriz son {1,2,3,4,5,6,7};

Si calculamos GCD de 7 y 2, entonces sería 1. Por lo tanto, los elementos se moverán dentro de un solo conjunto, simplemente comenzamos con temp =arr[0] y seguimos moviendo arr[I+d] a arr[I] y finalmente almacene la temperatura en el lugar correcto.

#include <stdio.h>
#include <stdint.h>

//Calculate array size
#define ARRAY_SIZE(arr)  sizeof(arr)/sizeof(arr[0])


//Calculate the calculateGcd
int calculateGcd(int a, int b)
{
    if (b == 0)
    {
        return a;
    }
    else
    {
        return calculateGcd(b, a % b);
    }
}

//Function to left rotate array of size n by k
void leftRotate(int arr[], int k, int n)
{
    int i, a, b, temp;
    // To handle if k >= n
    k = k % n;
    const int gcd = calculateGcd(k, n);
    for (i = 0; i < gcd; i++)
    {
        /* move i-th values of blocks */
        temp = arr[i];
        a = i;
        while (1)
        {
            b = a + k;
            if (b >= n)
                b = b - n;
            if (b == i)
                break;
            arr[a] = arr[b];
            a = b;
        }
        arr[a] = temp;
    }
}

//print array elements
void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n\n");
}


int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7};

    //get array size
    int arr_size = ARRAY_SIZE(arr);

    printf("Original Array = ");
    printArray(arr, arr_size);

    printf("Left shift array by 2 = ");
    leftRotate(arr, 2, arr_size);
    printArray(arr, arr_size);

    return 0;
}

Salida: 3 4 5 6 7 1 2

Artículos recomendados para ti:

  • El mejor regalo para programadores.
  • Los mejores kits electrónicos para programadores.
  • Reorganizar la matriz de modo que los elementos en las posiciones pares sean mayores que los impares en C.
  • Programa en C para eliminar duplicados de una matriz ordenada
  • Encuentre la mediana de dos arreglos ordenados de diferentes tamaños usando código C.
  • Programa C para encontrar la primera y última posición del elemento en una matriz ordenada
  • Escriba un programa en C para encontrar el número que falta en una matriz de enteros dada de 1 a n
  • Programa en C para encontrar el elemento más popular en una matriz
  • Encuentre el elemento más grande y el más pequeño en una matriz usando la programación C.
  • Programa C para encontrar incluso elementos que ocurren en una matriz de rango limitado
  • Encuentra la suma de todos los subconjuntos de un conjunto determinado.
  • Programa en C para segregar números pares e impares
  • Encuentre un elemento en la matriz tal que la suma de la matriz izquierda sea igual a la suma de la matriz derecha.
  • Programa C para encontrar el conteo de elementos pares e impares en la matriz.
  • Escribe un programa en C para encontrar la suma de los elementos del arreglo.