【算法练习】农夫约翰的奶酪块

发布于:2025-03-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

农夫约翰的奶酪块



一、题目

农夫约翰有一块立方体形状的奶酪,它位于三维坐标空间中,从 (0,0,0)
延伸至 (N,N,N)。

农夫约翰将对他的奶酪块执行一系列 Q
次更新操作。

对于每次更新操作,农夫约翰将从整数坐标 (x,y,z)
到 (x+1,y+1,z+1)
处切割出一个 1×1×1
的奶酪块,其中 0≤x,y,z<N。

输入保证在农夫约翰切割的位置上存在一个 1×1×1
的奶酪块。

由于农夫约翰正在玩牛的世界,当下方的奶酪被切割后,重力不会导致上方的奶酪掉落。

在每次更新后,输出农夫约翰可以将一个 1×1×N
的砖块插入奶酪块中的方案数,使得砖块的任何部分都不与剩余的奶酪重叠。

砖块的每个顶点在全部三个坐标轴上均必须具有整数坐标,范围为 [0,N]。农夫约翰可以随意旋转砖块。

输入格式
输入的第一行包含 N
和 Q。

以下 Q
行包含 x,y 和 z,为要切割的位置的坐标。

输出格式
在每次更新操作后,输出一个整数,为所求的方案数。

数据范围
2≤N≤1000,
1≤Q≤2×105,
0≤x,y,z<N

输入样例:
2 5
0 0 0
1 1 1
0 1 0
1 0 0
1 1 0
输出样例:
0
0
1
2
5
样例解释
在前三次更新操作后,[0,1]×[0,2]×[0,1]
范围的 1×2×1
砖块与剩余的奶酪不重叠,因此它贡献了答案。

二、分析

暴力枚举

本题是用二维模拟,所以我们创建三个二维数组来模拟三维空间的每一个面,第一个面是(x, y) 第二个面是(y, z) 第三
个面是(x, z),因为本题要插入一个含有一条边是N的柱体不与原来的图形重叠,那我们可以推断出一定是横竖方向长度连续为N(可以>N)的小正方体被挖 去,也就是某个平面上连续的长度为N的面被挖去,转换到二维空间上的点上,只要此点被用过N次(一个面上),就代表被挖去N个连续的正方体


三、题解

#include <iostream>

const int N = 1010;

int main()
{
	int a[N][N],b[N][N],c[N][N];
	int n,Q;
	scanf("%d%d",&n,&Q);
	int res = 0;
	
	while(Q--)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		a[x][y]++;
		b[y][z]++;
		c[x][z]++;
		if(a[x][y] == n) res++;
		if(b[y][z] == n) res++;
		if(c[x][z] == n) res++;
		printf("%d\n",res);
	}

	return 0;

}

总结

到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!