POJ 1806 Manhattan 2025

POJ 1806 Manhattan 2025

大意:在一个三维空间里面,有一交通工具通过一单位长度需要一升汽油,现有n升汽油,画出该交通工具在各层的运输情况
      将每一层简化为一个以交通工具所在位置为中心的二维网格图,在可达网格内写入到达该网格所需要的汽油数。
   自底向上画出每一层所在的二维图。
   当n>9时,不需要统计
Example:
    n = 2 时,若标记当前这一层为0层,则该情况下交通工具所能达到的层次为-2层到2层,即共5层,分别为-2,-1,0,1,2层,
将每一层的二维图输出即可。题目中要求将最底层即为1,那么在该情况下,上述各层对应为第1,2,3,4,5层,其中交通工
具所在的位置为第3层。
分析:
    通过简单的推断可发现,各层的情况以当前交通工具所在层为中心对称,故可用递归实现~

 

代码
#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 " );

}
}
return 0 ;
}

 

转载于:https://www.cnblogs.com/AndreMouche/archive/2011/01/27/1946092.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值