сдвиг двумерного массива по столбцам

Добрый день возникла такая проблема никак не могу понять как сделать сдвиг массива по столбцам вверх может ли кто-то обьяснить как это сделать. Я сделал сдвиг влево вправо и вниз.


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "rus");
int a[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i=0,j=0,t=1,k,l=1,g;
int ni,nj;
char menu;
srand(time(NULL));

for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}
//первая двойка
        while(t==1)
            {
                    i=rand()%4;
                j=rand()%4;

            if (a[i][j]==0)
                {
                a[i][j]=2;
                t=0;
                ni=i;
                nj=j;
                }

                i=rand()%4;
                j=rand()%4;

            }
printf("\n");printf("\n");
//первый вывод с 2
for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}
        t=1;

do{
system("cls");
printf("1 влево\n");
printf("2 вправо\n");
printf("3 вниз\n");
printf("4 вверх\n");
printf("0 выход\n");
                    menu = getchar();
                switch (menu)

        {
        case '1':

            while(t==1)
            {
                i=rand()%4;
                j=rand()%4;

            if (a[i][j]==0)
                {
                a[i][j]=2;
                t=0;
                }
            }
            t=1;
                  for (k = 0; k < 4; k++)
//k - номер текущей строки
  {
  for(i = 0;i < 4; i++)
    {
    for (j = 3; j > i; j--) {
                if((a[k][j]!=0)&&(a[k][j-1]==0))
                        {

                            a[k][j-1]=a[k][j];
                            a[k][j]=0;

                        }

                    if ((a[k][j]!=0)&&(a[k][j-1]==a[k][j]))
                        {
                        a[k][j-1]=2*a[k][j-1];
                        a[k][j]=0;

                        }
    }}}
    for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}

system("pause");
            break;
        case '2':

            while(t==1)
            {
                i=rand()%4;
                j=rand()%4;

            if (a[i][j]==0)
                {
                a[i][j]=2;
                t=0;
                ni=i;
                nj=j;
                }
            }
            t=1;


  for(i = 0;i < 4; i++)
    {
    for (j = 0; j < 3; j++) {
                if((a[i][j]!=0)&&(a[i][j+1]==0))
                        {

                            a[i][j+1]=a[i][j];
                            a[i][j]=0;

                        }

                    if ((a[i][j]!=0)&&(a[i][j+1]==a[i][j]))
                        {
                        a[i][j+1]=2*a[i][j+1];
                        a[i][j]=0;

                        }
    }}
    for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}
        printf("\n");
        system("pause");
    break;
case '3':

            while(t==1)
            {
                i=rand()%4;
                j=rand()%4;

            if (a[i][j]==0)
                {
                a[i][j]=2;
                t=0;
                ni=i;
                nj=j;
                }
            }
            t=1;
        /*for (i = 0; i < 4; i++){
                for ( j = 0; j < 3; j++){
                    for ( g = 0; g < 4 ; g++){

                if((a[j][g]!=0)&&(a[j][g+1]==0))
                        {

                            a[j][g+1]=a[j][g];
                            a[j][g]=0;

                        }

                    if ((a[j][g]!=0)&&(a[j][g+1]==a[j][g]))
                        {
                        a[j][g+1]=2*a[j][g+1];
                        a[j][g]=0;

                        }
    }}}*/
    for(i=0;i<4;i++){
        for(j=0;j<3;j++){
            if((a[j][i]!=0)&&(a[j+1][i]==0))
            {
                a[j+1][i]=a[j][i];
                            a[j][i]=0;


            }
            if ((a[j][i]!=0)&&(a[j+1][i]==a[j][i]))
                        {
                        a[j+1][i]=2*a[j+1][i];
                        a[j][i]=0;


                        }
        }

    }
     for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}
        system("pause");
    break;

    case '4':

            while(t==1)
            {
                i=rand()%4;
                j=rand()%4;

            if (a[i][j]==0)
                {
                a[i][j]=2;
                t=0;
                ni=i;
                nj=j;
                }
            }
            t=1;




             for(i=0;i<4;i++){
        printf("\n");
        for(j=0;j<4;j++){
printf("%3d",a[i][j]);
        }}
        system("pause");
    break;
        }
}while (menu != '0');




 return 0;
}


Ответы (0 шт):