1 条题解
-
0
物体堆叠模拟问题,主要处理多个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
- 上传者