我需要做的是在内部创建一个3> = n> = 8行和列的随机矩阵,程序应该这样做直到找到对角线对称的矩阵,然后打印出来,随机数必须是从0到7,并且应该有一个功能,其中将变量形式从true更改为false,您可以选择打印还是不打印不对称的矩阵。我已经能够创建随机矩阵,直到它对称为止,但是仅对于3x3,上面的任何数字都会让我的pc永久地思考,我确信必须有一种更有效的方法来做到这一点,但是我不太擅长于此代码得到了:
#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;
}
答案 0 :(得分:1)
将我的评论转换为答案。
要确定矩阵是否与前导对角线对称,只需检查matrix[r][c] == matrix[c][r]
。为了提高效率,您应该确保不要检查对角线并且不要检查任何东西两次。无需像问题中那样创建转置。这样可以加快比较速度。但最终,随着矩阵变大,随机生成对称矩阵几乎是不可能的。
如果您有一个2x2矩阵,每个像元包含的整数值在0..7范围内,则您有八分之一的机会得到关于前导对角线对称的矩阵。如果您有3x3矩阵,则由于对角线上方有3个像元,因此概率降低为8³或1:512,因为在对角线上方有3个像元,而对角线以下的每个对应像元都有相同值的机会是8分之一。如果使用4x4矩阵,则每8英寸或1:4096会下降到1;如果是5x5,则概率降为8或1:32767,以此类推。对于NxN矩阵,将概率提高8到N(N-1)/ 2的幂。
我还没有想到只比较三角形的一半的方法。
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]
进行比较。
请注意,如果目标是生成对称但随机的矩阵(每个像元包含0..7范围内的整数值,则可以使用类似的循环(但使用c = r
而不是{{1} })并使用c = r + 1
。内循环开始条件的变化也分配给前导对角线,或者您可以避免通过以下方式将两次分配给前导对角线上的元素:
matrix[r][c] = matrix[c][r] = rand() % 8;