1 条题解

  • 0
    @ 2025-5-25 17:35:08

    物体堆叠模拟问题,主要处理多个XBOX结构的堆叠,并计算堆叠后的高度分布。算法核心在于模拟XBOX堆叠过程中的碰撞检测和高度计算。

    算法流程

    输入处理与初始化: 读取XBOX数量n、宽度w和限制b 对每个XBOX,读取其高度和结构数据 计算每个宽度位置j的up[j](X的顶部相对高度)和down[j](X的底部相对高度)

    堆叠模拟: 第一个XBOX直接放置,底部高度为0 对于后续每个XBOX,计算其合理的底部高度: 从当前可能的最高位置开始尝试 检查是否与下方XBOX碰撞(通过比较down[j]up[j]的位置) 找到不发生碰撞的最低位置(即最大的合理底部高度)

    高度分布计算: 遍历所有XBOX,计算堆叠后的高度分布 跟踪当前最大高度,当超过限制b时,记录当前段的最大高度并重置

    总结

    该算法通过模拟物体堆叠过程,实现了对XBOX堆叠的碰撞检测和高度计算。核心在于通过上下边界判断避免碰撞,并统计堆叠后的高度分布。这种模拟方法在游戏物理引擎、物体堆叠规划等场景中有实际应用价值。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int maxn = 100 + 10;
    struct XBOX{
    	int n;
    	char s[maxn][maxn];
    	int down[maxn];
    	int up[maxn];
    	int downhei;
    }p[maxn];
    vector<int >ans;
    int main(){
    	int n,w,b;
    	while(scanf("%d %d %d",&n,&w,&b) == 3 && (n || w || b)){
    		ans.clear();
    		for (int i = 0; i < n; ++i){
    			int h;
    			scanf("%d",&h);
    			for (int j = 0; j < h; ++j)scanf("%s",p[i].s[j]);
    			p[i].n = h;
    			for (int j = 0; j < w; ++j){
    				for (int k = 0; k < h; ++k){
    					if (p[i].s[k][j] == 'X'){
    						p[i].up[j] = h-k-1;
    						break;
    					}
    				}
    			}
    			for (int j = 0; j < w; ++j){
    				for (int k = h-1; k >= 0; --k){
    					if (p[i].s[k][j] == 'X'){
    						p[i].down[j] = h-k-1;
    						break;
    					}
    				}
    			}
    		}
    		int cur = p[0].n;
    		p[0].downhei = 0;
    		for (int i = 1; i < n; ++i){
    			p[i].downhei = cur;
    			while(1){
    				bool ok = true;
    				for (int j = 0; j < w; ++j){
    					if (p[i].down[j] + p[i].downhei - p[i-1].up[j] - p[i-1].downhei <=  1){
    						ok =false;
    						break;
    					}
    					
    				}
    				if (!ok)break;
    				p[i].downhei--;
    			}
    			cur += p[i].n;
    		}
    //        for (int i =0 ; i < n;++i)printf("downhei = %d\n",p[i].downhei);
    //        for (int i = 0; i < n; ++i){
    //            for (int j = 0; j < w; ++j){
    //                printf("%d ",p[i].down[j]);
    //            }
    //            puts("");
    //        }
    		int CurMax = 0;
    		int subcur = 0;
    		for (int i = 0; i < n; ++i){
    			if (p[i].downhei - subcur + p[i].n > CurMax){
    				if (p[i].downhei - subcur + p[i].n > b){
    //                    printf("npew is %d\n",i);
    					ans.push_back(CurMax);
    					CurMax=p[i].n;
    					subcur = p[i].downhei;
    				} else CurMax = p[i].downhei - subcur + p[i].n;
    			}
    		}
    		if (CurMax <= b)ans.push_back(CurMax);
    		int len = ans.size();
    //        printf("len = %d\n",len);
    		for (int i = 0; i < len ;++i){
    			if (i)printf(" ");
    			printf("%d",ans[i]);
    		}
    		puts("");
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    2315
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    1
    已通过
    1
    上传者