算法知识点: 字符串处理,模拟,坐标变换
复杂度:
解题思路:
首先将一个小正方体的投影画出来:
char box[6][8] = {
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
}; 然后为了正确处理遮挡关系,按照从下到上、从后到前、从左到右的顺序画每个小正方体即可。
接下来需要将三维坐标 (x, y, z)(x,y,z) 投影到二维平面上,为了清楚,我们约定三维坐标系的方向如下所示:
投影到的二维平面的坐标系如下所示:
我们将三维坐标系中最靠左、前、下的点,和二维坐标系中左下角的点(取为左下角的点)对齐。
然后找规律可以发现二者的映射关系:左下角在 的小立方体,投影之后:
- 横坐标是
- 纵坐标是
C++ 代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 500, M = 60;
int n, m;
char box[6][8] = {
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
};
char g[N][N];
int h[M][M];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
cin >> h[i][j];
// i = 1, j = n - 1, k = 0: 499, 0
// i = 1, j = n - 2, k = 0: 497, 2
// i = 1, j = n - 1, k = 1: 499, 4
// ...
// i = 2, j = n - 1, k = 0: 496, 0
// i = 2, j = n - 2, k = 0: 494, 2
// ...
// 499 - (i - 1) * 3 - j * 2
// j * 2 + k * 4
for (int i = 0; i < N; i ++ )
for (int j = 0; j < N; j ++ )
g[i][j] = '.';
for (int i = 1; i <= 100; i ++ )
for (int j = 0; j < n; j ++ )
for (int k = 0; k < m; k ++ )
if (h[j][k] >= i)
{
int x = 499 - (i - 1) * 3 - (n - 1 - j) * 2;
int y = (n - 1 - j) * 2 + k * 4;
for (int a = 0; a < 6; a ++ )
for (int b = 0; b < 7; b ++ )
if (box[a][b] != '.')
g[x - 5 + a][y + b] = box[a][b];
}
int x = 0;
for (int i = 0; ; i ++ )
{
bool flag = false;
for (int j = 0; j < N; j ++ )
if (g[i][j] != '.')
{
flag = true;
break;
}
x = i;
if (flag) break;
}
int y = N - 1;
for (int i = N - 1; ; i -- )
{
bool flag = false;
for (int j = 0; j < N; j ++ )
if (g[j][i] != '.')
{
flag = true;
break;
}
y = i;
if (flag) break;
}
for (int i = x; i < N; i ++ )
{
for (int j = 0; j <= y; j ++ )
cout << g[i][j];
cout << endl;
}
return 0;
} 
京公网安备 11010502036488号