免费注册 查看新帖 |

Chinaunix

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

[C] 打印矩阵!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-08 23:33 |只看该作者 |倒序浏览
20可用积分
打印如下形式的矩阵;

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

n=6:
1   2   9 10 25 26
4   3   8 11 24 27
5   6   7 12 23 28
16 15 14 13 22 29
17 18 19 20 21 30
36 35 34 33 32 31

最佳答案

查看完整内容

http://blog.chinaunix.net/u2/76292/showart_2065683.html

论坛徽章:
0
2 [报告]
发表于 2009-10-08 23:33 |只看该作者
http://blog.chinaunix.net/u2/76292/showart_2065683.html


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void printMatrix(int N)
  4. {
  5.   int i =1;
  6.   int j = 1;
  7.    
  8.   for(;i<=N;++i)
  9.   {
  10.   for(j=1;j<=N;++j)
  11.    {
  12.     if(i<=j)
  13.     {
  14.       if(j%2)
  15.         printf("%d\t",(j-1)*(j-1)+2*j-i);
  16.       else
  17.         printf("%d\t",(j-1)*(j-1)+i);
  18.     }
  19.    else
  20.     {
  21.      if(i%2)
  22.        printf("%d\t",(i-1)*(i-1)+j);
  23.      else
  24.        printf("%d\t",(i-1)*(i-1)+2*i-j);
  25.     }
  26.    }
  27.   printf("\n");
  28. }
  29. }

  30. int main(int argc, char *argv[])
  31. {
  32.   printMatrix(5);
  33.   system("PAUSE");   
  34.   return 0;
  35. }


复制代码

论坛徽章:
0
3 [报告]
发表于 2009-10-09 00:54 |只看该作者

  1. #include <stdio.h>

  2. void
  3. print_matrix (int n)
  4. {
  5.   int i, j, k, a[n][n];

  6.   for (k = 0; k < n; k++)
  7.     {
  8.       if ((k % 2) == 1)
  9.         for (i = 0; i <= k; i++)
  10.           {
  11.             a[i][k] = k * k + i + 1;
  12.             a[k][i] = (k + 1) * (k + 1) - i;
  13.           }
  14.       else
  15.         for (i = 0; i <= k; i++)
  16.           {
  17.             a[k][i] = k * k + i + 1;
  18.             a[i][k] = (k + 1) * (k + 1) - i;
  19.           }
  20.     }
  21.   for (i = 0; i < n; i++)
  22.     {
  23.       for (j = 0; j < n; j++)
  24.         printf ("%2d ", a[i][j]);
  25.       putchar ('\n');
  26.     }
  27. }

  28. int
  29. main ()
  30. {
  31.   int n;

  32.   scanf ("%d", &n);
  33.   print_matrix (n);
  34. }
复制代码


  1. pc:~/src$ ./a.out
  2. 4
  3. 1  2  9 10
  4. 4  3  8 11
  5. 5  6  7 12
  6. 16 15 14 13

  7. pc:~/src$ ./a.out
  8. 5
  9. 1  2  9 10 25
  10. 4  3  8 11 24
  11. 5  6  7 12 23
  12. 16 15 14 13 22
  13. 17 18 19 20 21

  14. pc:~/src$ ./a.out
  15. 6
  16. 1  2  9 10 25 26
  17. 4  3  8 11 24 27
  18. 5  6  7 12 23 28
  19. 16 15 14 13 22 29
  20. 17 18 19 20 21 30
  21. 36 35 34 33 32 31
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-10-09 01:00 |只看该作者
沿对角线从左上到右下,n 每增大 1,则多打印“一层”。

每层中最大的数是个完全平方数:1, 4, 9, 16....
每层中最小的数是完全平方数加 1。

按这个规律逐层填进去就可以了,填的时候注意奇偶层填入方向不同。

论坛徽章:
0
5 [报告]
发表于 2009-10-09 12:10 |只看该作者
我也贴一个,思路与上面几位的不同。

我的方法是模拟“实际”填入的过程,用 x, y 标记位置,通过一个估值函数求出下一步的位置。估值标准为尽可能靠近原来的那堆点。


  1. #include <stdio.h>

  2. #define N 9
  3. int a[N][N], t;

  4. int weight (int x, int y)
  5. {
  6.   if (x<0 || x>= N || y<0 || y>=N || a[x][y]==0)
  7.     return 0;
  8.   else
  9.     return 1+(x==y);
  10. }

  11. int value (int x, int y)
  12. {
  13.   int i, j, s=0;
  14.   if (x<0||x>=N||y<0||y>=N || a[x][y]!=0)
  15.     return 0;

  16.   for (i=x-1; i<=x+1; i++)
  17.     for (j=y-1; j<=y+1; j++)
  18.       {
  19.         if (!(i==x && j==y))
  20.             s+=weight(i,j);
  21.       }
  22.   return s;
  23. }

  24. void next (int *x, int *y)
  25. {
  26.   int i=0, j=0, d, current=0;

  27.   if ((d=value(*x-1, *y))>current)
  28.     i=*x-1, j=*y, current=d;
  29.   
  30.   if ((d=value (*x+1, *y))>current)
  31.     i=*x+1, j=*y, current=d;
  32.   
  33.   if ((d=value (*x, *y-1))>current)
  34.     i=*x, j=*y-1, current=d;
  35.   
  36.   if ((d=value (*x, *y+1))> current)
  37.     i=*x, j=*y+1, current=d;

  38.   *x=i, *y=j;
  39.   a[i][j]= ++t;
  40. }


  41. int
  42. main ()
  43. {
  44.   int x, y;

  45.   a[0][0]=1; a[0][1]=2;
  46.   x=0, y=1, t=2;


  47.   while (t<N*N)
  48.     next(&x, &y);

  49.   for (x=0; x<N; x++)
  50.     {
  51.       for (y=0; y<N; y++)
  52.         printf ("%2d ", a[x][y]);

  53.       putchar ('\n');
  54.     }
  55. }

复制代码

[ 本帖最后由 win_hate 于 2009-10-9 12:16 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-10-09 12:39 |只看该作者
版主的思路不错^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP