【发布时间】:2020-08-19 16:19:38
【问题描述】:
我需要做的是在内部创建一个 3>=n>=8 行和列的随机矩阵,程序应该这样做,直到找到一个对角对称的,然后打印它,随机数必须是从 0 到 7,并且应该有一个功能,可以将变量形式从 true 更改为 false,您可以选择打印或不打印不对称的矩阵。我已经能够创建随机矩阵,直到它是对称的,但仅限于 3x3,上面的任何数字都会让我的电脑永远在思考,我确定必须有更有效的方法来做到这一点,但我不太擅长 c 这里的代码 ive得到:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int simetria (int n, int matriz[n][n], int transpuesta[n][n]);
int main(void)
{
setbuf(stdout, NULL);
srand(time(0));
int n, r, c, symmetry = 0;
scanf("%i", &n);
int matriz [n][n],transpuesta[n][n];
int contador = ((n*n)-n);
while(symmetry != contador)
{
for(r = 0; r<n; r++){
for(c = 0; c<n; c++){
matriz [r][c] = (rand() %8);
}
}
for(r = 0; r<n; r++){
for(c = 0; c<n; c++){
transpuesta[c][r] = matriz [r][c];
}
}
symmetry = simetria(n, matriz, transpuesta);
}
printf("\n");
for(r = 0; r<n; r++){
for(c = 0; c<n; c++){
printf("%i \t", matriz [r][c]);
}
printf("\n\n");
}
return 0;
}
int simetria (int n, int matriz[n][n], int transpuesta[n][n])
{
int r, c;
int symmetry = 0;
for(r = 0; r<n; r++){
for(c = 0; c<n; c++){
if (r!=c){
if (transpuesta[r][c] == matriz [r][c]){
symmetry++;
}
else{
symmetry = 0;
return symmetry;
}
}
}
}
return symmetry;
}
【问题讨论】:
-
为了确定矩阵是否关于前导对角线对称,您是否只需要检查
matrix[r][c] == matrix[c][r],确保您不检查对角线并且不要检查任何两次。无需创建转置。这将加快比较。但最终,随着矩阵变大,随机生成对称矩阵是不太可能的。 -
你不是宁愿只生成一个三角形,然后对角线反射它...
-
@JonathanLeffler 好的,所以你说得对,我删除了所有转置的东西,我现在遇到的问题是只检查一次,我还没有想到只比较一半三角形的方法避免做剩下的转置。
-
for (int r = 0; r < n; r++) { for (int c = r + 1; c < n; c++) { if (matrix[r][c] != matrix[c][r]) { …asymmetric… } } }— 如果这是在布尔函数中,您可以return false;检测不对称,return true;如果循环完成。首先将matrix[0][1][与matrix[1][0]进行比较。请注意,如果目标是生成一个对称但随机的矩阵,您将使用类似的循环(但使用c = r而不是c = r + 1)并使用matrix[r][c] = matrix[c][r] = rand() % 8;或其他。内循环开始条件的变化也分配给前导对角线。 -
我认为你的算法本质上会很慢。生成对称矩阵也更快,只需同时填充底部和顶部。
标签: c arrays matrix random-seed symmetric