for循环打印之利用二维数组储存数据

一,杨辉三角

  1,组合数性质之这世界总有人是例外

    领导想在30人的班级里选10个人,然而,有一个是例外,刚开始这人家徒四壁,被淘汰了,于是c(30,10)就变成了c(29,10)

  第二天,这人中彩票了,于是他就被内定了,于是就变成了c(29,9)。对于所有人来讲,这两种选择都是不公平的,但根据分类加法计数原理,

  这两情况加起来就包含了所有情况,即c(30,10)=c(29,10)+c(29,9),the end。 

int i, j, n;
    while (scanf("%d", &n) != EOF)
    {
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= i; j++)
            {
                if (i == 1 && j == 1)
                {
                    a[i][j] = 1;
                    printf("1");
                }
                else
                {
                    a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
                    printf("%-5d", a[i][j]);
                }
            }
            printf("\n");
        }
        printf("\n");
    }
    

  2,当然也可以直接用公式,不但省时间,而且省空间

int s = 1, h;
    int i, j;
    while (scanf("%d", &h) != EOF)
    {
        printf("1\n");
        for (i = 2; i <= h; s = 1, i++)      //少了第一行 所以 i从2开始       
        {
            printf("1");

            for (j = 1; j <= i - 2; j++)       // 少了第一个和最后一个  所以减2
                printf(" %d", (s = (i - j) * s / j));     //组合数 累乘和累除  
                                                          //除法要放最后面 才可以保证整除
            printf(" 1\n");
        }
    }

 

二,可以一笔画填数的

  1,回形填数

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

while (scanf("%d", &n) != EOF)
    {
        memset(a, 0, sizeof(a));
        int num = 1, x = 0, y = 0;
        a[0][0] = 1;

        while (num < n*n)   // 结束循环条件是 num==n*n
        {
            while (x+1 < n&&a[x + 1][y] == 0)   //试探下一个可不可以
                a[++x][y] = ++num;
            while (y+1 < n&&a[x][y+1] == 0)
                a[x][++y] = ++num;
            while (x - 1 >= 0 && a[x - 1][y] == 0)
                a[--x][y] = ++num;
            while (y - 1 >= 0 && a[x][y - 1] == 0)
                a[x][--y] = ++num;
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                printf("%3d", a[i][j]);
            }
            printf("\n");
        }
        printf("\n");
}

 

  2,蛇形填数 

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

while (scanf("%d", &n) != EOF)
    {
        
        memset(a, 0, sizeof(a));
        int x = 1, y = 1, num = 1;
        a[1][1] = 1;
        while (num < n*n)
        {
            while (x + 1 <= n&&y - 1 >= 1)
                a[++x][--y] = ++num;
            if (n == x)  //这里判断的是在左上三角形还是右下三角形,两者路线有差别
                x++;
            else
                a[++x][y] = ++num;
while (x - 1 >= 1 && y + 1 <= n) a[--x][++y] = ++num; if (n == y) y++; else a[x][++y] = ++num; } for (int i = 0; i <= n+1; i++) { for (int j = 0; j <= n+1; j++) { printf("%3d", a[i][j]); } printf("\n"); } printf("\n"); }

 

这是移动路径。 

 

 

========== ========== ======= ====== ====== ===== ==== === == =

你背不下来的书  总有人能背下来

你做不出来的题  总有人能做出来

你愿意拖到明天的事  总有人今天努力做完

那么不好意思


你想去的学校也只能别人去了


你想过的人生也只能别人过了

 

posted @ 2019-12-29 14:13  叫我妖道  阅读(429)  评论(0编辑  收藏  举报
~~加载中~~