сдвиг двумерного массива по столбцам
Добрый день возникла такая проблема никак не могу понять как сделать сдвиг массива по столбцам вверх может ли кто-то обьяснить как это сделать. Я сделал сдвиг влево вправо и вниз.
#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;
}