大意
在一个三维空间里面,有一交通工具通过一单位长度需要一升汽油,现有n升汽油,画出该交通工具在各层的运输情况
将每一层简化为一个以交通工具所在位置为中心的二维网格图,在可达网格内写入到达该网格所需要的汽油数。
自底向上画出每一层所在的二维图。
当n>9时,不需要统计
Example:
n = 2 时,若标记当前这一层为0层,则该情况下交通工具所能达到的层次为-2层到2层,即共5层,分别为-2,-1,0,1,2层,将每一层的二维图输出即可。
题目中要求将最底层即为1,那么在该情况下,上述各层对应为第1,2,3,4,5层,其中交通工
具所在的位置为第3层。
分析
通过简单的推断可发现,各层的情况以当前交通工具所在层为中心对称,故可用递归实现~
Answer
#include<stdio.h>
#include<math.h>
void draw(int n,int row,int floor)//画出距离交通工具所在层floor层的二维图
{
int i,j;
for(i=0;i<row;i++)
{
int needi = abs(i-n);//在垂直方向需要的步骤
for(j=0;j<row;j++)
{
int needj = abs(j-n);//水平方向需要的步骤
int need = needi+needj+floor;
if(need<=n)printf("%d",need);
else
printf(".");
}
printf("\n");
}
}
void output(int n,int row,int floor)//共有n汽油,有row行,现在第floor层
{
printf("slice #%d:\n",n-floor+1);
if(n>9)//若汽油大于9
{
draw(n,row,floor+1);
return;
}
draw(n,row,floor);//画下面的第floor层
if(floor==0)return;
output(n,row,floor-1);//画中间的那一部分
printf("slice #%d:\n",n+floor+1);
draw(n,row,floor);//上面的第floor层
}
int main()
{
int T;
while(scanf("%d",&T)!=EOF)
{
int cases;
for(cases=1;cases<=T;cases++)
{
int n;
scanf("%d",&n);
printf("Scenario #%d:\n",cases);
output(n,2*n+1,n);
printf("\n");
}
}
return0;
}