P1058 立体图

说实话,这题我是抄题解过的。

但是做完之后发现这个题也并不是非常难理解(但是不太好写),主要有一下需要注意的地方:

  • 覆盖顺序:从下到上,从左往右,从前往后

  • 观察出每个立方体的特殊点坐标,比如这里选的是左下角

  • 我这里的图是反着存储的

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 55;
int n, m;
int h[N][N];
int maxx, maxy;
char ans[1000][1000];
int k[6] = { 2, 1, 0, 0, 0, 0 };
int kc[6] = { 6, 6, 6, 6, 5, 4 };
char b[10][10] = {
	"  +---+",
	" /   /|",
	"+---+ |",
	"|   | +",
	"|   |/ ",
	"+---+	",
};

void fg(int x, int y) {
		for(int i = 5; i >= 0; i--)
			for(int j = k[i]; j <= kc[i]; j++) {
				ans[5 - i + x][j + y] = b[i][j];
				if(5 - i + x > maxx) maxx = 5 - i + x;
				if(j + y > maxy) maxy = j + y;
			}
}

int main() {
	cin >> n >> m;
	for(int i = 1; i <= n; i++)	
		for(int j = 0; j < m; j++)
			cin >> h[i][j];
	for(int i = 1; i <= n; i++)
		for(int j = 0; j < m; j++)
		 	for(int k = 0; k < h[i][j]; k++) {
		 		fg((n - i) * 2 + 1 + 3 * k, (n - i) * 2 + 1 * 4 * j);	
			}	
	for(int i = maxx; i >= 1; i--) {
		for(int j = 0; j <= maxy; j++) 
			if(ans[i][j] == '\000') cout << ".";
			else printf("%c", ans[i][j]);
		printf("\n");	
	}
	return 0;	
}

最后这里是图每步覆盖的坐标和图的生成过程(图是反着存的),这样就更容易理解了:

5 5
...........
...........
...........
...........
....+---+..
....|   |\.
....|   | +
....+---+ |
.....\   \|
......+---+
8 5
...........
...........
...........
...........
....+---+..
....|   |\.
....|   | +
....+---+ |
....|   |\|
....|   | +
....+---+ |
.....\   \|
......+---+
5 9
...............
...............
...............
...............
....+---+---+..
....|   |   |\.
....|   |   | +
....+---+---+ |
....|   |\   \|
....|   | +---+
....+---+ |....
.....\   \|....
......+---+....
8 9
...............
...............
...............
...............
....+---+---+..
....|   |   |\.
....|   |   | +
....+---+---+ |
....|   |   |\|
....|   |   | +
....+---+---+ |
.....\   \   \|
......+---+---+
5 13
...................
...................
...................
...................
....+---+---+---+..
....|   |   |   |\.
....|   |   |   | +
....+---+---+---+ |
....|   |   |\   \|
....|   |   | +---+
....+---+---+ |....
.....\   \   \|....
......+---+---+....
5 17
.......................
.......................
.......................
.......................
....+---+---+---+---+..
....|   |   |   |   |\.
....|   |   |   |   | +
....+---+---+---+---+ |
....|   |   |\   \   \|
....|   |   | +---+---+
....+---+---+ |........
.....\   \   \|........
......+---+---+........
8 17
.......................
.......................
.......................
.......................
....+---+---+---+---+..
....|   |   |   |   |\.
....|   |   |   |   | +
....+---+---+---+---+ |
....|   |   |\  |   |\|
....|   |   | +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
3 3
.......................
.......................
..+---+................
..|   |\...............
..|   | +---+---+---+..
..+---+ |   |   |   |\.
...\   \|   |   |   | +
....+---+---+---+---+ |
....|   |   |\  |   |\|
....|   |   | +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
6 3
.......................
.......................
..+---+................
..|   |\...............
..|   | +---+---+---+..
..+---+ |   |   |   |\.
..|   |\|   |   |   | +
..|   | +---+---+---+ |
..+---+ |   |\  |   |\|
...\   \|   | +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
3 7
.......................
.......................
..+---+---+............
..|   |   |\...........
..|   |   | +---+---+..
..+---+---+ |   |   |\.
..|   |\   \|   |   | +
..|   | +---+---+---+ |
..+---+ |   |\  |   |\|
...\   \|   | +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
6 7
.......................
.......................
..+---+---+............
..|   |   |\...........
..|   |   | +---+---+..
..+---+---+ |   |   |\.
..|   |   |\|   |   | +
..|   |   | +---+---+ |
..+---+---+ |\  |   |\|
...\   \   \| +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
3 11
.......................
.......................
..+---+---+---+........
..|   |   |   |\.......
..|   |   |   | +---+..
..+---+---+---+ |   |\.
..|   |   |\   \|   | +
..|   |   | +---+---+ |
..+---+---+ |\  |   |\|
...\   \   \| +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
3 15
.......................
.......................
..+---+---+---+---+....
..|   |   |   |   |\...
..|   |   |   |   | +..
..+---+---+---+---+ |\.
..|   |   |\   \   \| +
..|   |   | +---+---+ |
..+---+---+ |\  |   |\|
...\   \   \| +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
1 1
+---+..................
|   |\.................
|   | +---+---+---+....
+---+ |   |   |   |\...
.\   \|   |   |   | +..
..+---+---+---+---+ |\.
..|   |   |\   \   \| +
..|   |   | +---+---+ |
..+---+---+ |\  |   |\|
...\   \   \| +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
4 1
+---+..................
|   |\.................
|   | +---+---+---+....
+---+ |   |   |   |\...
|   |\|   |   |   | +..
|   | +---+---+---+ |\.
+---+ |   |\   \   \| +
.\   \|   | +---+---+ |
..+---+---+ |\  |   |\|
...\   \   \| +-|   | +
....+---+---+ |.+---+ |
.....\   \   \|..\   \|
......+---+---+...+---+
7 1
+---+..................
|   |\.................
|   | +---+---+---+....
+---+ |   |   |   |\...
|   |\|   |   |   | +..
|   | +---+---+---+ |\.
+---+ |   |\   \   \| +
|   |\|   | +---+---+ |
|   | +---+ |\  |   |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
1 5
+---+---+..............
|   |   |\.............
|   |   | +---+---+....
+---+---+ |   |   |\...
|   |\   \|   |   | +..
|   | +---+---+---+ |\.
+---+ |   |\   \   \| +
|   |\|   | +---+---+ |
|   | +---+ |\  |   |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
4 5
+---+---+..............
|   |   |\.............
|   |   | +---+---+....
+---+---+ |   |   |\...
|   |   |\|   |   | +..
|   |   | +---+---+ |\.
+---+---+ |\   \   \| +
|   |\   \| +---+---+ |
|   | +---+ |\  |   |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
1 9
+---+---+---+..........
|   |   |   |\.........
|   |   |   | +---+....
+---+---+---+ |   |\...
|   |   |\   \|   | +..
|   |   | +---+---+ |\.
+---+---+ |\   \   \| +
|   |\   \| +---+---+ |
|   | +---+ |\  |   |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
1 13
+---+---+---+---+......
|   |   |   |   |\.....
|   |   |   |   | +....
+---+---+---+---+ |\...
|   |   |\   \   \| +..
|   |   | +---+---+ |\.
+---+---+ |\   \   \| +
|   |\   \| +---+---+ |
|   | +---+ |\  |   |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
4 13
+---+---+---+---+......
|   |   |   |   |\.....
|   |   |   |   | +....
+---+---+---+---+ |\...
|   |   |\  |   |\| +..
|   |   | +-|   | + |\.
+---+---+ |\+---+ |\| +
|   |\   \| +\   \|-+ |
|   | +---+ |\+---+ |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
+---+---+---+---+......
|   |   |   |   |\.....
|   |   |   |   | +....
+---+---+---+---+ |\...
|   |   |\  |   |\| +..
|   |   | +-|   | + |\.
+---+---+ |\+---+ |\| +
|   |\   \| +\   \|-+ |
|   | +---+ |\+---+ |\|
+---+ |\   \| +-|   | +
.\   \|-+---+ |.+---+ |
..+---+  \   \|..\   \|
......+---+---+...+---+
### 创建立体层叠图的方法 #### 使用 Excel 制作立体层叠图 在 Microsoft Excel 中,可以通过设置三维柱形图来实现一种视觉上的“立体效果”。以下是具体操作方式: 1. 准备数据表:确保数据结构清晰,每一列代表一组不同的分类或变量。 2. 插入图表:选择数据区域后,在菜单栏中依次点击 **Insert -> Column Chart -> 3D Clustered Column** 或其他类似的三维选项[^4]。 3. 调整样式:右键单击生成的图表并调整其旋转角度、透视比例以及其他可视化参数以增强层次感。 需要注意的是,虽然Excel支持创建所谓的“立体”图形,但实际上这些只是二维投影模拟出来的效果,并不真正具备空间坐标系中的深度维度[^5]。 #### 使用 Matplotlib 实现更复杂的控制 对于更高精度的需求,则可以借助 Python 的科学计算库 Matplotlib 来完成真正的三维堆叠柱状图绘制工作。下面给出一段简单的代码示例用于说明这一过程: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') xpos = [1, 2, 3] ypos = [i for i in range(len(xpos))]*len(xpos) zpos = [0]*len(ypos) dx = [0.5]*len(zpos) dy = dx[:] dz = [[7], [5], [3]] colors = ['r', 'g', 'b'] for idx, z in enumerate(dz): ax.bar3d([p+(idx*0.6) for p in xpos], ypos[idx::3], zpos, dx, dy, dz=z, color=colors[idx]) plt.show() ``` 上述脚本定义了一个基本框架用来构建具有多个层级关系的数据模型并通过 `bar3d` 方法逐一渲染各个部分从而形成最终的整体图像[^6]. 尽管如此,值得注意的是即使采用这种方法所得到的结果也仅限于静态呈现形式;如果希望进一步提升交互性和动态特性的话可能还需要考虑引入额外的技术手段比如 WebGL 或者 Dash 等前端开发工具包来进行补充完善[^7].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值