【P084】立体图
Time Limit: 1 second
Memory Limit: 50 MB
【问题描述】
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
每个顶点用1个加号“+”表示,长用3个“-”表示,宽用1个“/”表示,高用两个“|”表示。字符“+”、“-”、“/”、“|”的ASCII码分别为43,45,47,124。字符“.”(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用“.”来代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
若两块积木上下相邻,图示为:
若两块积木前后相邻,图示为:
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下解的点。
【输入格式】
第一行有用空格隔开的2个整数m和n,表示有m*n个格子(1≤m,n≤50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1≤每个格子上的积木数≤50)。
【输出格式】
包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。
【输入样例】
3 4
2 2 1 2
2 2 1 1
3 2 1 2
【输出样例】
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=P084
【题意】
【题解】
先处理出只有一个正方体的情况;
->从坐标(x,y)开始往右上角填充1个正方体;
然后剩下的就是根据坐标反复用那个函数填充正方体就好;
注意一下坐标的细节就好;
模拟题啦
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1000;
const int maxn = 50 + 10;
char t[N][N];
int m, n,mx=1,my=1;
int a[maxn][maxn];
bool bo[N][N];
void o()
{
rep2(i, mx, 1)
{
rep1(j, 1, my)
{
if (t[i][j] == ' ')
{
if (bo[i][j])
putchar(' ');
else
putchar('.');
}
else
putchar(t[i][j]);
}
puts("");
}
}
void get_one(int x, int y)
{
t[x][y] = '+';
t[x][y+1] = t[x][y+2] = t[x][y+3] = '-'; t[x][y+4] = '+';
t[x+1][y] = t[x+2][y] = '|', t[x+3][y] = '+';
t[x+3][y+1] = t[x+3][y+2] = t[x+3][y+3] = '-'; t[x+3][y+4] = '+';
t[x+1][y+4] = t[x+2][y+4] = '|';
rep1(i, x+1, x+2)
rep1(j, y + 1, y + 3)
{
t[i][j] = ' ';
bo[i][j] = true;
}
t[x + 4][y+1] = '/';
//t[x + 4][y] = '.',
//t[x + 5][y] = t[x + 5][y+1] = '.';
t[x + 5][y+2] = '+';
rep1(i, 1, 3)
t[x + 5][y+i + 2] = '-';
t[x + 5][y + 6] = '+';
t[x + 4][y + 5] = '/';
rep2(i, x + 4, x + 3)
t[i][y + 6] = '|';
t[x + 1][y + 5] = '/';
t[x + 2][y + 6] = '+';
my = max(my, y + 6);
mx = max(mx, x + 5);
t[x + 2][y + 5] = t[x + 3][y + 5] = ' ';
bo[x + 2][y + 5] = bo[x + 3][y + 5] = true;
rep1(j, y + 2, y + 4)
{
t[x + 4][j] = ' ';
bo[x + 4][j] = true;
}
}
void input_data()
{
rei(m), rei(n);
rep1(i, 1, m)
rep1(j, 1, n)
rei(a[i][j]);
}
void get_ans()
{
int nowx = 2 * m - 1, nowy = 2 * m - 1;
rep1(i, 1, m)
{
rep1(j, 1, n)
{
int tx = nowx, ty = nowy;
while (a[i][j]--)
{
get_one(tx, ty);
tx += 3;
}
nowy += 4;
}
nowx = nowy = (m - i) * 2 - 1;
}
}
void init()
{
rep1(i, 1, N - 1)
rep1(j, 1, N - 1)
t[i][j] = ' ';
}
int main()
{
// freopen("F:\\rush.txt", "r", stdin);
init();
input_data();
get_ans();
//前后关系
//后(x1,y1),前(x1-2,y1-2);
//先弄后面那个
//左右关系
//左:(x1,y1),右(x1,y1+4)
//先左后右
//上下关系
//下(x1,y1),上(x1+3,y1);
//先下后上
o();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【P084】立体图的更多相关文章
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab slice方法和包络法绘制三维立体图
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
- Vijos P1497 立体图【模拟】
立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子, ...
- NOIP2008 立体图
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
- NOIP 2008 立体图 (字符串+模拟)
立体图 时间限制: 1 Sec 内存限制: 50 MB提交: 2 解决: 0[提交][状态][讨论版][命题人:外部导入] 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的 ...
- 2018.10.1 2018NOIP冲刺之立体图
2008NOIP普及组立体图 请自行百度(事实上放不下了) 图不是很清楚 下面有 [输入] 输入文件 drawing.in 第一行有用空格隔开的 2 个整数 m 和 n,表示有 m*n 个格子 (1 ...
- NOIP 2008 立体图
洛谷 P1058 立体图 洛谷传送门 JDOJ 1541: [NOIP2008]立体图 T4 JDOJ传送门 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备 ...
- luoguP1058:立体图 (真的不是娱乐向_(:з」∠)_)
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
随机推荐
- 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhange ...
- JS学习笔记 - 自定义右键菜单、文本框只能输入数字
<script> // 事件总共有2个部分, //1.点击鼠标右键的表现 oncontextmenu 2.点击鼠标左键的表现(即普通点击onclick) // 点击右键,div位置定位到鼠 ...
- 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas
[链接] 我是链接,点我呀:) [题意] 给你n个位置,然后让你从某些位置开始的|p|个位置,填上p这个字符串. 问你填的时候是否会发生冲突->输出0 否则输出最终n个位置组成的可能的字符串的总 ...
- keytool用法总结
一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...
- js 小数乘积位数太长
function accMul(arg1,arg2) { var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".& ...
- UVA 11609 - Teams 组合、快速幂取模
看题传送门 题目大意: 有n个人,选一个或者多个人参加比赛,其中一名当队长,如果参赛者相同,队长不同,也算一种方案.求一共有多少种方案. 思路: 排列组合问题. 先选队长有C(n , 1)种 然后从n ...
- android闹钟实现原理
闹钟的原理可用下面我自己画的一幅图来概括:(不对的地方,尽管吐槽) 我们来看看新建闹钟到闹钟响铃的步骤: 1.新建一个闹钟: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its manifest, ntstatus 0xc0150002
LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its mani ...
- Linux 下查看线程信息
1. 使用 pstree -p PID ps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 ? ...
- 【心情】"支NMLGB配树”
大视野oj坏了 那就做杭电呗 看看大触都做杭电里的哪些题 看到杭电的分类了 Tarjan算法诶,我好像会嘛,就是你了 诶,怎么不是求强连通分量? 哦,原来是Tarjan算法的另外一个应用叫做支配树 我 ...