Algorithm 如何制作N×;N矩阵第i行和第i列的每一行和第i列都有1到2N-1的所有元素?

Algorithm 如何制作N×;N矩阵第i行和第i列的每一行和第i列都有1到2N-1的所有元素?,algorithm,Algorithm,这个问题是在RS AGGARWAL的一本难题书中作为一个难题提出的,该书将问题描述为建立一个N阶矩阵,其中每个i行和i列的组合都有从1到2N-1的所有元素 例如,对于N=2 [3,2] [1,3] 我想知道什么时候可以得到一个答案,对于N的哪些值可以得到一个矩阵,以及如何得到它?然后为它写代码这有一个简单的方阵解,其中n是2的幂,所以不要问我为什么一定有数学证明 创建此类矩阵的算法很简单: 清除矩阵(使用0) 循环i通过所有值i=1,2,3…2n-1 对于每个i查找i矩阵尚未填充(0)且行

这个问题是在RS AGGARWAL的一本难题书中作为一个难题提出的,该书将问题描述为建立一个N阶矩阵,其中每个i行和i列的组合都有从1到2N-1的所有元素

例如,对于N=2

[3,2]
[1,3]

我想知道什么时候可以得到一个答案,对于N的哪些值可以得到一个矩阵,以及如何得到它?然后为它写代码这有一个简单的方阵解,其中n是2的幂,所以不要问我为什么一定有数学证明

创建此类矩阵的算法很简单:

  • 清除矩阵(使用
    0

  • 循环
    i
    通过所有值
    i=1,2,3…2n-1

  • 对于每个
    i
    查找
    i
    矩阵尚未填充(
    0
    )且行和列中不存在
    i
    的所有位置

    i
    填充该位置并重复,直到找不到该位置

  • C++中的类似于这样的事情:

    //---------------------------------------------------------------------------
    常数int n=8;
    int m[n][n];
    //---------------------------------------------------------------------------
    //计算每第i行值的直方图u[n+n],m[n][n]的列
    
    void hist_rst(int*u){for(int j=0;j这是方阵的简单解,其中
    n
    是2的幂,所以
    n=1,2,4,8,16,…
    不要问我为什么肯定有一些数学证明

    创建此类矩阵的算法很简单:

  • 清除矩阵(使用
    0

  • 循环
    i
    通过所有值
    i=1,2,3…2n-1

  • 对于每个
    i
    查找
    i
    矩阵尚未填充(
    0
    )且行和列中不存在
    i
    的所有位置

    i
    填充该位置并重复,直到找不到该位置

  • C++中的类似于这样的事情:

    //---------------------------------------------------------------------------
    常数int n=8;
    int m[n][n];
    //---------------------------------------------------------------------------
    //计算每第i行值的直方图u[n+n],m[n][n]的列
    
    void hist_rst(int*u){for(int j=0;j根据Spektre的要求,这里是6x6矩阵

    I一个有趣的属性,可以用作启发式。我们只需要解一个三角形矩阵,因为另一半可以很容易地推导出来。我们只需要用1到n的值填充矩阵的上(或下)半部分。然后我们可以使用a[j][I]=2n+1-a[I][j]的属性来完成矩阵

    我发现的另一个特性是,有一种简单的方法将1、2和N放入矩阵中。值1都在对角线上,值2和N在第2步紧靠对角线

    最后,我发现的另一件事是,奇数N的矩阵没有解。这是因为[I][j]中的值属于行和列I以及行和列j。因此,我们需要偶数行和列来存储所有值

    这是我手动找到的6x6矩阵

     1  2  3  4  5  6
    11  1  6  5  3  4
    10  7  1  2  4  5
     9  8 11  1  6  3
     8 10  9  7  1  2
     7  9  8 10 11  1
    
    我们可以看到2+11=6+7=3+10=13=2*6+1

    这是一个4x4矩阵

    1 2 3 4
    7 1 4 3
    6 5 1 2
    5 6 7 1
    
    这里同样是2+7=4+5=3+6=9=2*4+1

    可以有其他值大于N的排列,但是使用2N+1属性,我们可以从另一个三角形矩阵中简单地推导出一个三角形矩阵

    编辑

    这是一个功率双尺寸矩阵的解决方案。2048x2048尺寸的矩阵在57ms内生成(无需打印)

    #包括
    整数**新矩阵(整数n){
    int**m=calloc(n,sizeof(int*);
    m[0]=calloc(n*n,sizeof(int));
    对于(int i=1;i
    这是矩阵16x16。可以看出,利用对称性可以有效地生成矩阵

      1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16 
     31   1   4   3   6   5   8   7  10   9  12  11  14  13  16  15 
     30  29   1   2   7   8   5   6  11  12   9  10  15  16  13  14 
     29  30  31   1   8   7   6   5  12  11  10   9  16  15  14  13 
     28  27  26  25   1   2   3   4  13  14  15  16   9  10  11  12 
     27  28  25  26  31   1   4   3  14  13  16  15  10   9  12  11 
     26  25  28  27  30  29   1   2  15  16  13  14  11  12   9  10 
     25  26  27  28  29  30  31   1  16  15  14  13  12  11  10   9 
     24  23  22  21  20  19  18  17   1   2   3   4   5   6   7   8 
     23  24  21  22  19  20  17  18  31   1   4   3   6   5   8   7 
     22  21  24  23  18  17  20  19  30  29   1   2   7   8   5   6 
     21  22  23  24  17  18  19  20  29  30  31   1   8   7   6   5 
     20  19  18  17  24  23  22  21  28  27  26  25   1   2   3   4 
     19  20  17  18  23  24  21  22  27  28  25  26  31   1   4   3 
     18  17  20  19  22  21  24  23  26  25  28  27  30  29   1   2 
     17  18  19  20  21  22  23  24  25  26  27  28  29  30  31   1 
    

    根据Spektre的要求,这里是6x6矩阵

    I一个有趣的属性,可以用作启发式。我们只需要解一个三角形矩阵,因为另一半可以很容易地推导出来。我们只需要用1到n的值填充矩阵的上(或下)半部分。然后我们可以使用a[j][I]=2n+1-a[I][j]的属性来完成矩阵

    我发现的另一个特性是,有一种简单的方法将1、2和N放入矩阵中。值1都在对角线上,值2和N在第2步紧靠对角线

    最后,我发现的另一件事是,奇数N的矩阵没有解。这是因为[I][j]中的值属于行和列I以及行和列j。因此,我们需要偶数行和列来存储所有值

    这是我手动找到的6x6矩阵

     1  2  3  4  5  6
    11  1  6  5  3  4
    10  7  1  2  4  5
     9  8 11  1  6  3
     8 10  9  7  1  2
     7  9  8 10 11  1
    
    我们可以看到2+11=6+7=3+10=13=2*6+1

    这是一个4x4矩阵

    1 2 3 4
    7 1 4 3
    6 5 1 2
    5 6 7 1
    
    再来