转呀转不晕矩阵

来源:互联网 发布:creis中指数据 app 编辑:程序博客网 时间:2024/05/16 08:35

Problem Description

众所周知,C语言的学习是我们程序设计基础的重点和主要内容。
或是高中、又或是初中,小金学会了使用杨辉三角,同时也了解杨辉三角的由来。他觉得杨辉三角是一个神奇的发现,从中可以发现很多很多神奇的规律。
杨辉三角既是多项式(a+b)^n展开之后的每个项的二次项系数规律,又是二项式系数在三角形中的一种几何排列。
本质特征: 两条斜边都是由数字1构成,而其余的数都是由他肩上的两个数字之和,如下表。
第1行: 1
第2行: 1 1
第3行: 1 2 1
第4行: 1 3 3 1
第5行: 1 4 6 4 1
第....行: .................
小金是一个好奇的孩子,他想知道一个n行的杨辉三角摆在一个矩阵中是什么样子的,又因为小金的脑子因为感冒烧坏了眼睛,看东西都是旋转的,所以他填数的时候是不断旋转杨辉三角去按行填写矩阵,如果杨辉三角旋转完毕之后矩阵还没有满,就在剩余的地方补0,具体情况如下图。

Input

多组输入。
每次输入占一行,有一个整数n,代表杨辉三角的行数. (1 < =  n  < =  20).

Output

输出可填充的最小正矩阵,正矩阵是指长和宽相同的矩阵。
保证数据合法。

Example Input

2

Example Output

1 11 0
 
注:为了更加清晰的展示过程,其中加了很多题目本不需要的输出。
 
 
#include<stdio.h>#include<string.h>#include<math.h>int main(){    int a[21][21]={0};    int b[21][21]={0};    int c[441]={0};    int i,j,n,m,k;    int u;    int x,y,z;    while(scanf("%d",&n)!=EOF)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        m=(n*(n+1))/2;        k=sqrt(m);        if(k*k!=m)            k++;        // 杨辉三角的赋值        for(i=0;i<n;i++)        {            a[i][0]=1;        }        for(i=1;i<n;i++)        {            a[i][i]=1;        }        for(i=2;i<n;i++)        {            for(j=1;j<n-1;j++)            {                a[i][j]=a[i-1][j-1]+a[i-1][j];            }        }        // 输出赋值后的杨辉三角        for(i=0;i<n;i++)        {            for(j=0;j<=i;j++)            {                printf("%d%c",a[i][j],j!=i?' ':'\n');            }        }        //螺旋分离        u=0;        y=0;        x=1;        z=0;        while(u!=m)        {            for(j=y;j<n;j++)            {                if(u==m)                {                    c[u++]=a[j][x-1];                    break;                }                c[u++]=a[j][x-1];            }            for(j=x;j<n-z;j++)            {                if(u==m)                {                    c[u++]=a[n-1][j];                    break;                }                c[u++]=a[n-1][j];            }            n--;            for(j=n-1;j>y;j--)            {                if(u==m)                {                    c[u++]=a[j][j-z];                    break;                }                c[u++]=a[j][j-z];            }            x++;            y+=2;            z++;        }        // 输出分离后的杨辉三角         for(i=0;i<u;i++)         {             printf("%d ",c[i]);         }         printf("\n");        // 转化成正方形        u=0;        for(i=0;i<k;i++)        {            for(j=0;j<k;j++)            {                if(u==m)                    b[i][j]=c[u++];                else                    b[i][j]=c[u++];            }        }        // 输出正方形的杨辉三角        for(i=0;i<k;i++)        {            for(j=0;j<k;j++)            {                printf("%-2d%c",b[i][j],j<k-1?' ':'\n');            }        }        printf("\n");    }    return 0;}

 

 

 

0 0
原创粉丝点击