小金转呀转不晕矩阵
Time Limit: 1000MS MemoryLimit: 65536KB
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
Author
2015级期末测试 Casithy
#include<stdio.h>
int main(){
int n;
while(~scanf("%d",&n))
{
int i,a[21][21]={0},k,b[1000]={0};
a[1][1] = 1;
for(i=2;i<=n;i++)
{
for(k=1;k<=i;k++)
{
a[i][k] = a[i-1][k] +a[i-1][k-1];
}
}
/* for(i=1;i<=n;i++)
{
for(k=1;k<=i;k++)
{
printf("%d ",a[i][k]);
}
}
printf("\n#\n");*/
int j,o=n,m=0;
i = 1;
j = 0;
while(1)
{
if(o==0)
{
break;
}
for(k=1;k<=o;k++)
{
b[++m] = a[++j][i];
}
o--;
if(o==0)
{
break;
}
for(k=1;k<=o;k++)
{
b[++m] =a[j][++i];
}
o--;
if(o==0)
{
break;
}
for(k=1;k<=o;k++)
{
b[++m] = a[--j][--i];
}
o--;
}
for(i=1;m>i*i;i++);
int p = i;
int u=0;
for(i=1;i<=p*p;i++)
{
u++;
printf("%d",b[i]);
if(u%p==0)
{
printf("\n");
}
else
printf(" ");
}
}
return 0;
}
正解2:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int data[112][112]; int n; int ans[112345], tail; int init() { memset(data,0,sizeof(data)); memset(ans,0,sizeof(ans)); tail = 0; data[1][1] = 1; for (int i = 2; i <= n; i++) { for (int j = 1; j <= i; j++) { data[i][j] = data[i-1][j] + data[i-1][j-1]; // cout << data[i][j] << ' '; } // cout << endl; } int x1 = 1, y1 = 1; int x2 = n, y2 = n; while (x1 <= x2 && y1 <= y2) { for (int i = x1; i <= x2; i++) { ans[tail++] = data[i][y1]; } x1++; y1++; for (int i = y1; i <= y2; i++) { ans[tail++] = data[x2][i]; } x2--; y2--; for (int i = 0; x2-i >= x1 && y2-i >= y1; i++) { ans[tail++] = data[x2-i][y2-i]; } x1++; y2--; } } int main() { string str; while (cin >> n) { if (n == 1) { cout << 1 << endl; continue; } init(); int k; for (int i = 0; i < 100; i++) if (i*i >= tail) { k = i; break; } for (int i = 0; i < k*k; i++) { if (i && i%k == 0) cout << endl; else if (i) cout << ' '; cout << ans[i]; } cout << endl; } }