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 1 1 0
Hint
#include<stdio.h>
#include<string.h>
int s[30][30],g[1000],p[30][30];
int qa;
int ju(int a,int b,int c,int d, int n);
int main()
{
int i,j,n,m,k,d,jishu;
memset(s,0,sizeof(s));
s[1][1]=1;
for(i=2;i<=21;i++){
for(j=1;j<=i;j++){
s[i][j]=s[i-1][j-1]+s[i-1][j];
}
}
while(scanf("%d",&n)!=EOF)
{
qa=0;
memset(p,0,sizeof(p));
m=ju(1,n,1,n,0);
d=((n+1)*n)/2;
for(j=1;j*j<d;j++);
jishu=0;
for(i=1;i<=m;i++)
{
jishu++;
if(jishu%j==0) printf("%d\n",g[i]);
else printf("%d ",g[i]);
}
while(jishu<j*j)
{
jishu++;
if(jishu%j==0) printf("0\n");
else printf("0 ");
}
}
return 0;
}
int ju(int a,int b,int c,int d,int n)
{
int i,j;
for(i=c;i<=d;i++)
{
if(p[i][a]) continue;
n++;
g[n]=s[i][a];
p[i][a]=1;
}
for(i=a;i<=b;i++)
{
if(p[b][i]) continue;
n++;
g[n]=s[b][i];
p[b][i]=1;
}
for(i=b;i>a;i--)
{
if(p[i][i-qa]) continue;
n++;
g[n]=s[i][i-qa];
p[i][i-qa]=1;
}
qa++;
if(a>b) return n;
else if(c>d) return n;
else return ju(a+1,b-1,c+1,d-1,n);
}