NOIP 2008 立体图 (字符串+模拟)
立体图
时间限制: 1 Sec 内存限制: 50 MB
提交: 2 解决: 0
[提交][状态][讨论版][命题人:外部导入]
题目描述
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

每个顶点用1个加号‘+’表示,长用3个‘-’表示,宽用1个‘/’表示,高用两个‘|’表示。字符‘+’ ‘-’ ‘/’ ‘|’的ASCII码分别为43,45,47,124。字符‘.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用‘.’代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:

若两块积木上下相邻,图示为:

若两块积木前后相邻,图示为:

立体图中,定义位于第(m, 1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
输入
每组输入数据的第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1<=m,n<=50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。
输出
每组输出中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。
样例输入
3 4
2 2 1 2
2 2 1 1
3 2 1 2
样例输出
......+---+---+...+---+
..+---+ / /|../ /|
./ /|-+---+ |.+---+ |
+---+ |/ /| +-| | +
| | +---+ |/+---+ |/|
| |/ /| +/ /|-+ |
+---+---+ |/+---+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+---+---+---+---+ |/...
| | | | | +....
| | | | |/.....
+---+---+---+---+......
提示
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn1 100
#define maxn2 2000
using namespace std; int m,n,minx,maxx,miny,maxy;
int a[maxn1+][maxn1+];
char s[maxn2][maxn2]; void redirect()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
} void readdata()
{
int i,j,k;
scanf("%d%d",&m,&n);
for(i=;i<=m;i++)
for(j=;j<=n;j++)
scanf("%d",&a[i][j]); minx=-*(m-);
maxx=+*n+;
miny=-*(m-);
maxy=; for(i=minx;i<=maxx;i++)
for(j=miny;j<=+;j++)
s[i][j]='.';
} void write()
{
int i,j,k;
for(j=maxy;j>=miny;j--)
{
for(i=minx;i<=maxx;i++)printf("%c",s[i][j]);
printf("\n");
}
} void cover(int x,int y)
{
maxy=max(maxy,y+); s[x][y]=s[x+][y]='+';
s[x+][y]=s[x+][y]=s[x+][y]='-'; y++;
s[x][y]=s[x+][y]='|';
s[x+][y]=s[x+][y]=s[x+][y]=' ';
s[x+][y]='/'; y++;
s[x][y]=s[x+][y]='|';
s[x+][y]=s[x+][y]=s[x+][y]=s[x+][y]=' ';
s[x+][y]='+'; y++;
s[x][y]=s[x+][y]='+';
s[x+][y]=s[x+][y]=s[x+][y]='-';
s[x+][y]=' ';
s[x+][y]='|'; x++,y++;
s[x][y]=s[x+][y]='/';
s[x+][y]=s[x+][y]=s[x+][y]=' ';
s[x+][y]='|'; x++,y++;
s[x][y]=s[x+][y]='+';
s[x+][y]=s[x+][y]=s[x+][y]='-';
} void work()
{
int i,j,k,x1,y1,x2,y2,x3,y3;
x1=y1=;
for(i=;i<=m;i++)
{
x2=x1,y2=y1;
for(j=;j<=n;j++)
{
x3=x2,y3=y2;
for(k=;k<=a[i][j];k++)
cover(x3,y3),y3+=;
x2+=;
}
x1-=,y1-=;
}
write();
} int main()
{
//redirect();
readdata();
work();
return ;
}
NOIP 2008 立体图 (字符串+模拟)的更多相关文章
- NOIP 2008 立体图
洛谷 P1058 立体图 洛谷传送门 JDOJ 1541: [NOIP2008]立体图 T4 JDOJ传送门 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备 ...
- 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)
5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms ...
- Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)
P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...
- 2018.12.30【NOIP提高组】模拟赛C组总结
2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...
- 用字符串模拟两个大数相加——java实现
问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- HDU-3787(字符串模拟)
Problem Description 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开.现在请计算A+B的结果,并以正常形式输出. Input 输入包含 ...
- Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划)
Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划) Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m ...
- HDU-1002.大数相加(字符串模拟)
本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include <cstdio&g ...
随机推荐
- 探秘DPDK Virtio的不同路径
什么是Vhost/Virtio Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主 ...
- 拖拽窗口的实现-JQuery实现;
主要是距离的掌握 如图,原始位置和当前位置. 对于当前位置:想要求得left值b',需要b'=a'-c; 其中,a’= ev.pageX;就是指针当前距离文档左边的距离: 同时,可以发现c在拖拽过程中 ...
- 【C#基本功 控件的用法】 Toolbar的用法
之前从事Labview编程,Labview是一门快速编程的语言,虽然快速,但作为一门语言他灵活性不够,有些方面也不是很给力,就比如 Toolbar labview就没有Toolbar的基础控件,虽然可 ...
- python中多线程,多进程,队列笔记(一)
threading简介:If you want your application to make better use of the computational resources of multi- ...
- jsp的运行内幕--Tomcat容器对自定义标签的解析过程
http://blog.sina.com.cn/s/blog_4adc4b090101daqb.html
- C#模拟网络POST请求
using System; using System.IO; using System.Net; using System.Text; using System.Collections.Generic ...
- Arcgis for Js实现graphiclayer的空间查询(续)
上文中,实现了简单的针对graphiclayer的空间查询工作,在本节,将更加详细的介绍针对graphiclayer的空间查询.首先,空间查询的方式:提供多种类型的空间查询,包括点周边.线周边.面内等 ...
- Kotlin Android Extensions (译文)
原文链接: http://kotlinlang.org/docs/tutorials/android-plugin.html Kotlin Android Extensions 本教程介绍如何使用Ko ...
- (效果二)js实现两个变量值的交换
ES5: var a = 12,b=13,c; c = a; a = b; b = c; console.log(a,b);//13,12 通过设置第三方变量交换赋值来实现 ES6 var a = ...
- 【MFC】CDC::BitBlt介绍
CDC::BitBlt介绍 2011-11-04 08:25 19576人阅读 评论(6) 收藏 举报 摘自: http://blog.csdn.net/bberdong/article/detail ...