利用动态数组生成魔方矩阵

#利用动态数组生成魔方矩阵

难点

  • 随机数的产生
  • 矩阵大小根据 输入确定,动态分配内存
  • 实现魔方效果

魔方效果:如果矩阵大小为10*10,则矩阵内的100个数,为从1到100的整数不重复的随机排序。

效果如下图所示:

利用动态数组生成魔方矩阵_第1张图片

产生随机数

主要的两个函数。

srand(time(NULL)); //时间种子
k=rand()%(n*n);  //产生随机数

更多相关应用参考下列内容:

  • 对于100个随机产生的3位整数,求出它们中能够
    被3整除的奇数的平均值
  • C语言文件读写操作

动态矩阵

通过malloc()函数动态分配内存,n是待用户输入的值。

 ge=(int **)malloc(sizeof(int)*n*n);
       int i;
	   for(i=0;i<n;i++)
              ge[i]=(int *)malloc(sizeof(int)*n);

魔方效果

随机数产生具有随机性,所以自然产生的随机数 是可能重复的。而魔方效果要求的是 不重复

所以我们可以想到的解决方法是:

在产生随机数的时候,我们检测这个随机数是否已经产生过了,没有则记录下来,如果已经产生过了,我们要求重新产生。

好的,方法有了。具体怎么实现呢?
很明显,这重复产生随机数直到 产生出一个之前没有出现的随机数为止,这里需要一个 循环

对于怎么知道一个随机数之前有么有产生过呢,我们需要一个标记

对矩阵中的每个值执行系列的操作:

 count[k]=1;
                            while(count[k])
                                   k=1+rand()%(n*n);
                            ge[i][j]=k;
                            printf("%4d",ge[i][j]);

其中count是个int 指针,且在气count[n]以内,每个指向值都被初始化为0。

看到这里,你是否能够自己写出这个程序了呢?

这里提供参考代码如下:

#include 
#include 
#include 

int main()

{
       int n;
       printf("please input n:\n");
       scanf("%d",&n);
       srand(time(NULL));
       int **ge;
       ge=(int **)malloc(sizeof(int)*n*n);
       int i;
       for(i=0;i<n;i++)
              ge[i]=(int *)malloc(sizeof(int)*n);
       int *count;
       count=(int *)malloc(sizeof(int)*n*n);
       for(i=1;i<=n*n;i++)
              count[i]=0;
       int j,k=0;
       for(i=0;i<n;i++)
             {
                     for(j=0;j<n;j++)
                     {
                            count[k]=1;
                            while(count[k])
                                   k=1+rand()%(n*n);
                            ge[i][j]=k;
                            printf("%4d",ge[i][j]);
                     }
                     printf("\n");
              }
       return 0;
}

本博客内容到此为止,欢迎指正!

你可能感兴趣的:(C/C++)