在2d数组中移动元素c

时间:2016-11-10 17:17:23

标签: c arrays

所以我有2d数组填充随机数。例如:

#define d 4

int main(void)
{
int a[d][d];
int primary[d], secondary[d];
size_t i, j;

srand(time(NULL));

/* fill array with random numbers */
for (i = 0; i < d; i++)
    for (j = 0; j < d; j++)
        a[i][j] = rand() % 100;

/* save diagonals */
for (i = 0; i < d; i++)
{
    primary[i] = a[i][i];
    secondary[i] = a[d - (i + 1)][i];

如何镜像水平对角线?

例如:

1  0  0  2     

0  3  4  0

0  5  6  0

7  0  0  8
8  0  0  7

0  6  5  0

0  4  3  0

2  0  0  1

任务是打印主矩阵,然后使用镜像对角线打印矩阵,但是我不知道这个循环应该是什么样的。

我考虑过将旋转矩阵旋转180度的循环但是我会松开未包含在对角线中的元素的位置。

或者我可以保存对角线然后以某种方式反转它。 这是矩阵和对角线的代码,我现在应该做什么。

希望得到你的帮助。

1 个答案:

答案 0 :(得分:0)

方法之一是以下

#include <stdio.h>

#define N   4

int main(void) 
{
    int a[N][N] =
    {
        { 1,  0,  0,  2 },     
        { 0,  3,  4,  0 },
        { 0,  5,  6,  0 },
        { 7,  0,  0,  8 }
    };      

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

    printf( "\n" );

    for ( size_t i = 0; i < N * N / 2; i++ )
    {
        int tmp = a[i / N][i % N];
        a[i / N][i % N] = a[(N * N - i - 1) / N][(N * N - i - 1) % N];
        a[(N * N - i - 1) / N][(N * N - i - 1) % N] = tmp;
    }

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

    printf( "\n" );

    return 0;
}

程序输出

1 0 0 2 
0 3 4 0 
0 5 6 0 
7 0 0 8 

8 0 0 7 
0 6 5 0 
0 4 3 0 
2 0 0 1 

可以使用指针编写相同的内容。例如

#include <stdio.h>

#define N   4

int main(void) 
{
    int a[N][N] =
    {
        { 1,  0,  0,  2 },     
        { 0,  3,  4,  0 },
        { 0,  5,  6,  0 },
        { 7,  0,  0,  8 }
    };      

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

    printf( "\n" );

    for ( int *first = ( int * )a, *last = ( int * )a + N * N; 
          first < last; 
          ++first, --last )
    {
        int tmp = first[0];
        first[0] = last[-1];
        last[-1] = tmp;
    }

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

    printf( "\n" );

    return 0;
}