NOIP 2008 Vijos 1497 立体图 模拟

在Vijos上编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 1340 KiB, score = 10

测试数据 #1: Accepted, time = 0 ms, mem = 1336 KiB, score = 10

测试数据 #2: Accepted, time = 0 ms, mem = 1336 KiB, score = 10

测试数据 #3: Accepted, time = 0 ms, mem = 1328 KiB, score = 10

测试数据 #4: Accepted, time = 0 ms, mem = 1336 KiB, score = 10

测试数据 #5: Accepted, time = 0 ms, mem = 1332 KiB, score = 10

测试数据 #6: Accepted, time = 15 ms, mem = 1336 KiB, score = 10

测试数据 #7: Accepted, time = 0 ms, mem = 1340 KiB, score = 10

测试数据 #8: Accepted, time = 0 ms, mem = 1332 KiB, score = 10

测试数据 #9: Accepted, time = 0 ms, mem = 1336 KiB, score = 10

Accepted, time = 15 ms, mem = 1340 KiB, score = 100

这道题看起来比较难,但实际上还是比较简单的。

首先我们要画出来一个立方体。

void draw(int x, int y)
{
	int i, j;
	for(i = y + 1; i < y + 4; i++)
		canvas[x][i] = canvas[x - 3][i] = canvas[x - 5][i + 2] = '-';
	for(i = x - 1; i > x - 3; i--)
		canvas[i][y] = canvas[i][y + 4] = canvas[i - 2][y + 6] = '|';
	for(i = x - 1; i > x - 3; i--)
		for(j = y + 1; j < y + 4; j++)
			canvas[i][j] = ' ';
	for(i = x - 2; i > x - 4; i--)
		canvas[i][y + 5] = ' ';
	for(i = y + 2; i < y + 5; i++)
		canvas[x - 4][i] = ' ';
	canvas[x][y] = canvas[x - 3][y] = canvas[x][y + 4] = canvas[x - 3][y + 4] = '+';
	canvas[x - 4][y + 1] = canvas[x - 4][y + 5] = canvas[x - 1][y + 5] = '/';
	canvas[x - 5][y + 2] = canvas[x - 5][y + 6] = canvas[x - 2][y + 6] = '+';
}

draw(x,y)表示从在画布上左小角坐标为x,y画立方体。

实际上也可以用常量定义立方体,然后复制到数组里。

然后我们要确定画布的长和宽。

长比较好求,因为每个格子都回至少有1个立方体,现在就是要确定宽。

	width = 4 * n + 1 + 2 * m;
	height = 0;
	for(i = 1; i <= m; i++)
		for(j = 1; j <= n; j++)
			height = max(height, hei[i][j] * 3 + 1 + 2 * (m - i) + 2);


意思比较好理解了。

hei是每个格子的高度。

height是宽,width是长。

然后初始化画布。

现在就是在哪里画立方体。

	for(i = 1; i <= m; i++)
		for(j = 1; j <= n; j++)
		{
			for(k = 1; k <= hei[i][j]; k++)
				draw(height - 2 * (m - i) - ((k-1)*3), 4 * (j - 1) + 1 + (m - i) * 2);
		}



i和j是格子的坐标,k是格子的高度

height-2*(m-i)-((k-1)*3)表示x坐标,4*(j-1)+1+(m-i)*2表示y坐标。

最后打印画布即可。


#include <stdio.h>
#define max(a,b) (a)>(b)?(a):(b)
#define M 50
#define N 50


int n, m;
int i, j, k;
int p, q;
int width, height;
int hei[M][N];
char canvas[900][900];

void draw(int x, int y)
{
	int i, j;
	for(i = y + 1; i < y + 4; i++)
		canvas[x][i] = canvas[x - 3][i] = canvas[x - 5][i + 2] = '-';
	for(i = x - 1; i > x - 3; i--)
		canvas[i][y] = canvas[i][y + 4] = canvas[i - 2][y + 6] = '|';
	for(i = x - 1; i > x - 3; i--)
		for(j = y + 1; j < y + 4; j++)
			canvas[i][j] = ' ';
	for(i = x - 2; i > x - 4; i--)
		canvas[i][y + 5] = ' ';
	for(i = y + 2; i < y + 5; i++)
		canvas[x - 4][i] = ' ';
	canvas[x][y] = canvas[x - 3][y] = canvas[x][y + 4] = canvas[x - 3][y + 4] = '+';
	canvas[x - 4][y + 1] = canvas[x - 4][y + 5] = canvas[x - 1][y + 5] = '/';
	canvas[x - 5][y + 2] = canvas[x - 5][y + 6] = canvas[x - 2][y + 6] = '+';
}

int main()
{
	scanf("%d%d", &m, &n);
	for(i = 1; i <= m; i++)
		for(j = 1; j <= n; j++)
			scanf("%d", &hei[i][j]);
	width = 4 * n + 1 + 2 * m;
	height = 0;
	for(i = 1; i <= m; i++)
		for(j = 1; j <= n; j++)
			height = max(height, hei[i][j] * 3 + 1 + 2 * (m - i) + 2);
	for(i = 1; i <= height; i++)
		for(j = 1; j <= width; j++)
			canvas[i][j] = '.';
	for(i = 1; i <= m; i++)
		for(j = 1; j <= n; j++)
		{
			for(k = 1; k <= hei[i][j]; k++)
				draw(height - 2 * (m - i) - ((k-1)*3), 4 * (j - 1) + 1 + (m - i) * 2);
		}
	for(p = 1; p <= height; p++)
	{
		for(q = 1; q <= width; q++)
			putchar(canvas[p][q]);
		putchar('\n');
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值