小金转呀转不晕矩阵

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);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值