免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6160 | 回复: 17
打印 上一主题 下一主题

趣味编程 - 矩阵生成 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-26 11:00 |只看该作者 |倒序浏览
想练练手的试一试

输入一奇数n,生成如下矩阵
n=3
9   2   3   
8   1   4   
7   6   5   

n=5
25  10  11  12  13  
24  9    2    3   14  
23  8    1    4   15  
22  7    6    5   16  
21  20  19  18  17  

n=9
81  50  51  52  53  54  55  56  57  
80  49  26  27  28  29  30  31  58  
79  48  25  10  11  12  13  32  59  
78  47  24  9     2   3    14  33  60  
77  46  23  8     1   4    15  34  61  
76  45  22  7     6   5    16  35  62  
75  44  21  20  19  18  17  36  63  
74  43  42  41  40  39  38  37  64  
73  72  71  70  69  68  67  66  65

论坛徽章:
0
2 [报告]
发表于 2011-01-26 13:34 |只看该作者
  1. #include <stdio.h>
  2. int i, j, x, y, s, c, n;
  3. int main()
  4. {
  5.         scanf("%d", &n);
  6.         for (i = 0; i < n; ++i) {
  7.                 for (j = 0; j < n; ++j) {
  8.                         x = i > (n >> 1) ? n - 1 - i : i;
  9.                         y = j > (n >> 1) ? n - 1 - j : j;
  10.                         c = x <= y ? x : y;
  11.                         s = n - (c << 1);
  12.                         s *= s;
  13.                         if (j == c)
  14.                                 printf("%4d", s - i + c);
  15.                         else {
  16.                                 s -= n - (c << 1);
  17.                                 if (i == n - 1 - c)
  18.                                         printf("%4d", s - j + c + 1);
  19.                                 else {
  20.                                         s -= n - (c << 1);
  21.                                         if (j == n - 1 - c)
  22.                                                 printf("%4d", s - n + c + i + 3);
  23.                                         else
  24.                                                 printf("%4d", s - (n << 1) + (c << 1) + c + j + 4);
  25.                                 }
  26.                         }
  27.                 }
  28.                 putchar('\n');
  29.         }
  30.         return 0;
  31. }
复制代码
运行结果
  1. $ ./a.out
  2. 11
  3. 121  82  83  84  85  86  87  88  89  90  91
  4. 120  81  50  51  52  53  54  55  56  57  92
  5. 119  80  49  26  27  28  29  30  31  58  93
  6. 118  79  48  25  10  11  12  13  32  59  94
  7. 117  78  47  24   9   2   3  14  33  60  95
  8. 116  77  46  23   8   1   4  15  34  61  96
  9. 115  76  45  22   7   6   5  16  35  62  97
  10. 114  75  44  21  20  19  18  17  36  63  98
  11. 113  74  43  42  41  40  39  38  37  64  99
  12. 112  73  72  71  70  69  68  67  66  65 100
  13. 111 110 109 108 107 106 105 104 103 102 101
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-01-26 14:34 |只看该作者
回复 2# daybreakcx


    强悍,如果生成如下的矩阵呢?
5   6   7   
4   1   8   
3   2   9   

17  18  19  20  21  
16  5   6   7   22  
15  4   1   8   23  
14  3   2   9   24  
13  12  11  10  25

论坛徽章:
0
4 [报告]
发表于 2011-01-26 14:55 |只看该作者
第一题:主要是算a[0][1]
n*n - n*4 + 5

第二题:a[0][0]
n*n -2*n + 2

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
5 [报告]
发表于 2011-01-26 15:22 |只看该作者
本帖最后由 damcool 于 2011-01-26 15:24 编辑

第一题
  1. void matrix(int n)
  2. {
  3.     int **ary;
  4.     int xStep,yStep,iDir,Pos,x,y;
  5.     ary=(int**)calloc(n, sizeof(int*));
  6.     for(x=0;x<n;x++) ary[x]=(int*)calloc(n, sizeof(int));
  7.     Pos=n*n;
  8.     iDir=0;
  9.     x=y=0;
  10.     xStep=0;
  11.     yStep=1;
  12.     while (Pos>0)
  13.     {
  14.         ary[x][y]=Pos;
  15.         if ((x+xStep<0) || (x+xStep>=n) || (y+yStep<0) ||(y+yStep>=n) || ary[x+xStep][y+yStep]>0)
  16.         {
  17.             iDir++;
  18.             iDir%=4;
  19.             xStep=(iDir % 2)*(1-(iDir&2));
  20.             yStep=((iDir+1)%2)*(1-(iDir+1&2)) ;
  21.         }
  22.         x+=xStep;
  23.         y+=yStep;
  24.         Pos--;
  25.     }
  26.     for(y=0;y<n;y++)
  27.     {
  28.         for (x=0;x<n;x++)
  29.         printf("%4d",ary[x][y]);
  30.         printf("\n");
  31.     }
  32.     for(x=0;x<n;x++)
  33.     free(ary[x]);
  34.     free(ary);
  35. }
复制代码
第二体只要修改
  1.     iDir=3;
  2.     x=y=n-1;
  3.     xStep=0;
  4.     yStep=-1;
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-01-26 15:28 |只看该作者
本帖最后由 erlangs 于 2011-01-26 15:41 编辑

  1. void round(int n)
  2. {
  3.     int **matrix;
  4.     matrix = (int **)malloc(sizeof(int *)*n);
  5.     int in;
  6.     for (in=0; in<n; in++)
  7.         matrix[in] = (int *)malloc(sizeof(int)*n);

  8.     matrix[n/2][n/2] = 1;
  9.     int n2,np, i, x = 0, y = 1, x_step, y_step;
  10.     for(;n>=3;n -= 2,x++,y += 2)
  11.     {
  12.         n2=n*n;
  13.         x_step = 0;
  14.         y_step = 1;
  15.         for(i = (n-2)*(n-2)+1; i <= n2; i++)
  16.         {
  17.             printf("n = %d, x = %d,y= %d value = %d\n",n,x,y,i);
  18.             matrix[x][y] = i;
  19.             np = n-1;
  20.             if(i == (n2 - np*3))       // 第一个拐点
  21.             {
  22.                 x_step = 1;
  23.                 y_step = 0;
  24.             }
  25.             else if(i == (n2 - np*2))
  26.             {
  27.                 x_step = 0;
  28.                 y_step = -1;
  29.             }
  30.             else if(i == (n2 - np))
  31.             {
  32.                 x_step = -1;
  33.                 y_step = 0;
  34.             }
  35.             else if(i == n2)
  36.             {
  37.                 continue;
  38.             }

  39.             x += x_step;
  40.             y += y_step;
  41.         }
  42.     }
  43. }
复制代码

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
7 [报告]
发表于 2011-01-26 15:36 |只看该作者
  1. void __matrix(int n,int row)
  2. {
  3.     int i,j;
  4.     if(n == 1)
  5.     {
  6.         printf("1\t");
  7.         return;
  8.     }
  9.     if(row == 0)
  10.     {
  11.         printf("%d\t",n*n);
  12.         for(i = (n-2)*(n-2)+1,j = 0;j < n-1;j++,i++)
  13.         {
  14.             printf("%d\t",i);

  15.         }
  16.         return;
  17.     }else if(row == n-1)
  18.     {
  19.         for(i = n*(n-1)+1,j=0;j<n;i--,j++)
  20.         {
  21.             printf("%d\t",i);

  22.         }
  23.         return;
  24.     }else{
  25.         i = n*n;
  26.         printf("%d\t",i - row);
  27.         __matrix(n-2,row-1);
  28.         printf("%d\t",n*n+(n-1)*(n-1)-n+2-i+row);
  29.     }
  30. }

  31. void rotation_matrix(int n)
  32. {
  33.     int i;
  34.     for(i = 0;i < n; i++)
  35.     {
  36.         __matrix(n,i);
  37.         printf("\n");
  38.     }
  39. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-01-26 15:48 |只看该作者
第一题:主要是算a[0][1]
n*n - n*4 + 5

第二题:a[0][0]
n*n -2*n + 2
carry01 发表于 2011-01-26 14:55



   
同阳萎兄的思路

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
9 [报告]
发表于 2011-01-26 16:54 |只看该作者
回旋矩阵啊,好经典

论坛徽章:
0
10 [报告]
发表于 2011-01-26 19:13 |只看该作者
acm的题目 做过的……不难
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP