ACM 蛇形阵

花了一个早晨,做了一道同济大学的ACM题目,题目是:
蛇行矩阵
Problem
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

Input
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

Output
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。

矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

Sample Input
5

Sample Output
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

起初就觉得奇怪,好象蛇行阵不是这样的,管它了,能做就行,可是做这种数学题那真是累,现在越来越觉得自己的数学是那么的烂啊,郁闷!~``~~~`
但还是“艰难”地完成了:

#include
int main()
{
int a[20][20];
int i,n,m,x,y,num=1;
printf("input n:/n");
scanf("%d",&n);
    for(i=1;i<=n;i++)    //将数字赋给二维数组
    {
        x=i;y=1;
        for(int count=1;count<=i;count++)
        {
            a[x][y]=num;
            num++;
            x--;
            y++;
        }
    }
for(x=1;x<=n;x++)        //打印数组
{
for(y=1;y<=n-x+1;y++)
printf("%d ",a[x][y]);
printf("/n");

}
return 0;
}

可是没想到代码原来这么简单,就是FOR循环这里害我半天转不过弯来。早晨起来又看到一道题:

矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:
//   ① 倒填,例如N=5             ② 蛇形填数              ③ 回转填数
//
// ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐
// │25│24│23│22│21│   │ 1│ 3│ 4│10│11│   │ 1│16│15│14│13│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │20│19│18│17│16│   │ 2│ 5│ 9│12│19│   │ 2│17│24│23│12│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │15│14│13│12│11│   │ 6│ 8│13│18│20│   │ 3│18│25│22│11│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │10│ 9│ 8│ 7│ 6│   │ 7│14│17│21│24│   │ 4│19│20│21│10│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │ 5│ 4│ 3│ 2│ 1│   │15│16│22│23│25│   │ 5│ 6│ 7│ 8│ 9│
// └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘

挖靠!中间这道才是我以前见过的地地道道的蛇行阵,前面的就不说了,中间的这道比我上面做的那道就是拐了个弯而已,环绕方向变了,而上面的这道是同个方向,但是我还是绞尽脑汁做了出来:
#include
int main()
{
 int a[20][20];
 int i,n,m,x,y,num=1;
 printf("input n:/n");
 scanf("%d",&n);

    for(i=1;i<=n;i++)    //将数字赋给蛇形阵的上三角
    {
  if(i%2==1)
  {
   x=1;
   y=i;
   for(int count=1;count<=i;count++)
   {
              a[x][y]=num;
              num++;
              x++;
              y--;
   }
  }
  else
  {
   x=i;
   y=1;
   for(int count=1;count<=i;count++)
   {
              a[x][y]=num;
              num++;
              x--;
              y++;
   }
  }
 }
 num=n*n;
 for(i=n;i>1;i--)               //将数字赋给蛇形阵的下三角
 {
  if(i%2==1)
  {
   x=n;
   y=i;
   for(int count=1;count<=n+1-i;count++)
   {
    a[x][y]=num;
    num--;
    x--;
    y++;
   }
  }
  else
  {
   x=i;
   y=n;
   for(int count=1;count<=n+1-i;count++)
   {
    a[x][y]=num;
    num--;
    x++;
    y--;
   }
  }
 }
 
 for(x=1;x<=n;x++)        //打印数组
  {
   for(y=1;y<=n;y++)
    printf("%d ",a[x][y]);
   printf("/n");
  }
 return 0;
}

 

说真的,看到这些嵌套的循环头都大了,即使是自己做的,答案也对了,都不想回过头去再看一遍啊,我已经死了不少脑细胞了~~~~`

下学期就学数据结构了,这门课非常重要的,因为它讲究的是思想和考虑问题的角度,对任何一们语言都是适用的,现在好好努力了,同过上面几道所谓的ACM题(其实没那么简单吧)可以看出自己的数学和算法真的很弱啊,只有继续做题了,会慢慢积累的...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值