标题:一个要求非常苛刻的二维数组群,如何构建??
只看楼主
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
已结贴  问题点数:40 回复次数:16 
一个要求非常苛刻的二维数组群,如何构建??
继上次俺的提问圆满解决后,我想进一步深入探讨下一个问题,上次效果最好的,能满足要求的代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int a[13][13];
 int i, j, k, n,c,d;

   if ((fp = fopen ("D:\\wenjian.txt", "a+")) == NULL)
      {
        printf("打开文件失败\n");
        exit(1);
      }
   for (i=0; i<8192; ++i)
       {
           for (j=12; j>=0; --j)
               {
                   n = (i>>j)&1;
                   for (k=0; k<13; ++k)
                      a[12-j][k] = n;
               }
           for (c=0; c<13; ++c)
              {
                 for (d=0; d<13; ++d)
                 fprintf(fp, "%d ", a[c][d]);
                 fprintf(fp,"\n");       }
              fprintf(fp,"\n");
       }
   fclose(fp);
   return 0;
}
效果图如下:

现在我想让这每个二维数组的第0行的数据全部都是1 2 3 4 5 6 7 8 9 10 11 12 13.也就是如图:

这个二维数组群的每个二维数组的总行数还是13行,第0行的数据始终不变,变化的是第一行到第十二行的数据,还有,
第12行的数据和第1行的数据全等;
第11行的数据和第2行的数据全等;
第10行的数据和第3行的数据全等;
第9行的数据和第4行的数据全等;
第8行的数据和第5行的数据全等;
第7行的数据和第6行的数据全等;
原代码里面i<8192.现在有了这样的条件了,i的值应该远远小于8192了,到底应该是多少?我也没算出来。至于怎么改,则是很费脑筋。望大神们费神了。
搜索更多相关主题的帖子: 要求 维数 构建 for 数据 
2018-02-26 16:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 
变动对称的,可以用6*13
如果13列也是一样,可用6*1。
2018-02-26 16:54
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h> 
int main()
{
    FILE *fp;
    int i, j, k, n;
    static int tem[8192][13][13];//静态或全局 

    if ((fp = fopen ("D:\\wenjian.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
      
    for (i=0; i<8192; ++i)
    {
        for (j=12; j>=0; --j)//
        {
            n = (i>>j)&1;
            for (k=0; k<13; ++k)
             if(12-j) tem[i][12-j][k] = n;//这里可以处理“第12行的数据和第1行的数据全等;。。。”,但是你的规则不清,无法写代码 
             else tem[i][12-j][k] = 12-j+1+k; //对0行处理 
        }
    }
    //以下可以操作你的数组
    for (i=0; i<8192; ++i)
    {
        fprintf(fp,"i=%d\n",i); 
         for (j=0; j < 13; j++)
        {

            for (k=0; k<13; ++k)
             fprintf(fp, "%3d ", tem[i][j][k]);
             fprintf(fp,"\n"); 
        }  

 
    }
    
    return 0;
}


程序代码:
i=0
  1   2   3   4   5   6   7   8   9  10  11  12  13 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
i=1
  1   2   3   4   5   6   7   8   9  10  11  12  13 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  1   1   1   1   1   1   1   1   1   1   1   1   1 
//如上面的,是让1行填1,还是让13行填0?也就是说是让 1行 等于 13行,还是让13行 等于 1行?
i=2
  1   2   3   4   5   6   7   8   9  10  11  12  13 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  1   1   1   1   1   1   1   1   1   1   1   1   1 
  0   0   0   0   0   0   0   0   0   0   0   0   0 

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-02-26 18:29
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
是让13行 等于 1行
2018-02-26 18:37
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:15 
程序代码:
#include <stdio.h>
#include <stdlib.h> 
int main()
{
    FILE *fp;
    int i, j, k, n;
    static int tem[8192][13][13];//静态或全局 

    if ((fp = fopen ("D:\\wenjian2.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
      
    for (i=0; i<8192; ++i)
    {
      /*  for (j=0; j<7; j++)//
        {
            n = (i>>j)&1;
            for (k=0; k<13; ++k)
             if(j)
             {
                 tem[i][j][k] = n; 
                tem[i][13-j][k] = n;                 
              } //这样写是让第12行 = 第1行
              else tem[i][j][k] = 1+k; //对0行处理
           */
        for (j=13; j > 6; j--)//
        {
            n = (i>>j)&1;
              for (k=0; k<13; ++k)
             if(13!=j)
             {
                 tem[i][j][k] = n; 
                tem[i][13-j][k] = n;                 
              } //这样写是让 第1行 = 第12行 
              
             else tem[i][0][k] = 1+k; //对0行处理 
        }
    }
    //以下可以操作你的数组,保存,编辑,查看
    for (i=0; i<8192; ++i)
    {
        fprintf(fp,"i=%d\n",i); 
         for (j=0; j < 13; j++)
        {

            for (k=0; k<13; ++k)
             fprintf(fp, "%3d ", tem[i][j][k]);
             fprintf(fp,"\n"); 
        }  

 
    }
    
    return 0;
}


自己选,另处上次回贴就说了,你的数组又不大 tem[8192][13][13] 设个静态三维的就行了,代码写起来简单直观

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-02-26 18:52
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
按楼上的程序,相同的二维数组就有128个,这能不能相同数组只出现一次呢?
比如:
i=0
  1   2   3   4   5   6   7   8   9  10  11  12  13
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
就出现了128次了。
2018-02-26 22:41
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
第七楼的情况,我把原代码做了说明,如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    int i, j, k, n;
    static int tem[8192][13][13];//静态或全局

    if ((fp = fopen ("D:\\wenjian.txt", "a+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(1);
    }
      
    for (i=0; i<8192; ++i)// 二维数组大于I行后的数据全部数据归0,包括第0行。
    {
        for (j=13; j > 6; j--)//
        {
            n = (i>>j)&1;
              for (k=0; k<13; ++k)
             if(13!=j)
             {
                 tem[i][j][k] = n;
                tem[i][13-j][k] = n;                 
              } //这样写是让 第1行 = 第12行
              
             else tem[i][0][k] = 1+k; //对0行处理
        }
    }
     for (i=0; i<8192; ++i)//i:二维数组共有多少组
    {
        fprintf(fp,"i=%d\n",i);
         for (j=0; j < 13; j++)//J:二维数组的行数
        {

            for (k=0; k<13; ++k)//K:二维数组的列数
             fprintf(fp, "%3d ", tem[i][j][k]);
             fprintf(fp,"\n");
        }  
 
    }
   
    return 0;
}
2018-02-27 11:21
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
问问题要说清楚所有情况,如果有“能不能相同数组只出现一次呢”这一要求,这程式就不适宜用数组了

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-02-27 12:10
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
你可这样,用链表来做
struct linkedlist {
    unsigned int mark ;//重复检查标志
    int tem[13][13];//保存你要的数组
    struct linkedlist *next;
};
这个mark 可以这样
程序代码:
i=0
  1   2   3   4   5   6   7   8   9  10  11  12  13 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0 
把加粗的6个数转化为一int 作为是否重复的标志,因为你的数是对称的,所以只取6个就行

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-02-27 12:18
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
i=0
  1   2   3   4   5   6   7   8   9  10  11  12  13
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0

加粗失效,看这个

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-02-27 12:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484865-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.114598 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved