往箱子里堆木块,放满一个箱子(比它的高度高),则接着从一个新箱子开始放,求每个箱子木块的高度。
#include <iostream>
using namespace std;
struct data {
int up[11],down[11],h;
}a[101];
int n,w,b,t,now,tot,tmp,ans[101];
bool empty;
char s[101][11];
int main() {
while (scanf("%d%d%d",&n,&w,&b)) {
if (n==0 && w==0 && b==0) break;
for (int k=1;k<=n;k++) {
scanf("%d",&a[k].h);
getchar();
for (int i=1;i<=a[k].h;i++)
for (int j=1;j<=w+1;j++)
scanf("%c",&s[i][j]);
for (int i=1;i<=w;i++) {
t = 0;
for (int j=1;j<=a[k].h;j++)
if (s[j][i]=='.') t++;
else break;
a[k].up[i] = t;
}
for (int i=1;i<=w;i++) {
t = 0;
for (int j=a[k].h;j>=1;j--)
if (s[j][i]=='.') t++;
else break;
a[k].down[i] = t;
}
}
/*for (int k=1;k<=n;k++) {
for (int i=1;i<=w;i++)
printf("%d ",a[k].up[i]);
printf("\n");
for (int i=1;i<=w;i++)
printf("%d ",a[k].down[i]);
printf("\n\n");
}*/
now = 0;
tot = 0;
empty = true;
for (int k=1;k<=n;k++)
if (empty) {
empty = false;
now += a[k].h;
}
else {
tmp = 100000;
for (int i=1;i<=w;i++)
if ((a[k].down[i]+a[k-1].up[i])<tmp)
tmp = a[k].down[i]+a[k-1].up[i];
tmp = a[k].h-tmp;
if (tmp+now>b) {
ans[++tot] = now;
now = a[k].h;
}
else now += tmp;
}
if (now!=0) ans[++tot] = now;
for (int i=1;i<tot;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[tot]);
}
return 0;
}