具体题目要求输出一个图案,要先输入一个数n,比如输入n=2,n最大不超过9;
输出如下图案
0
0 1 0
0 1 2 1 0
0 1 0
0
分析思路:
考虑过中心的值是输入的最大值,它周围的都比它小1,对于非中心的值,可以判断如果这个数相邻的数比他大,就不变,否则就是这个数减去1后的结果,最终不知道如何实现好。所以放弃了,后来考虑先把过中心的行和列值全部赋值给一个数组相应的位置,得到了一个综合交叉的十字线,然后根据对角线上的值是一样的来确定没有填充的值,这个做到一半发现也不会了,放弃。后来想自己看到的这个图形也许实际不是这个样子的,只是选择性打印的结果,第一行只有一个0,第二行是0 1 0,两边的都是比中心的数小,而且对于一行数据,都是主次减去1直道为0,下一行的中心列的值比上一行相同位置大1,到了中间行后开始相反,要少1,最后选择大于等于0 的打印结果,否则打印空格。
#include<stdio.h>
#define MAX 9
int pic[2*MAX+1][2*MAX+1]={0};
/**
1
2
0 1 2 3 2 1 0
2
1
0*/
int main()
{
int n,i,j;
int d=0;
scanf("%d",&n);
for(i=MAX-n;i<=MAX+n;i++)
{
if(i<=MAX)
{
pic[i][MAX]=d++;
}
else
{
pic[i][MAX]=pic[i-1][MAX]-1;
}
for(j=0;j<n;j++)
{
pic[i][MAX-j-1]=pic[i][MAX-j]-1;
pic[i][MAX+j+1]=pic[i][MAX+j]-1;
}
}
for(i=MAX-n;i<=MAX+n;i++)
{
for(j=MAX-n;j<=MAX+n;j++)
{
if(pic[i][j]>=0)
{
printf("%-1d",pic[i][j]);
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}