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