题意:
n个罐子,每个罐子印了几行字,一行以#为界,最长的的一行记为w,每个罐子是高为6,宽为w的矩形+外面一圈#。按输入顺序将罐子叠放起来,规则为:罐子A(宽度w)只能放在宽度比它大的其他罐子上。从左往右遍历栈,如果当前最高栈罐子的宽度大于w,该罐子叠放到这一栈上。如果找不到这种栈,在最右边开辟一个新栈。另外,每个罐子叠放的位置和字的位置尽可能居中对齐,若不能,可以偏左或偏上一格。
最后让你输出罐子叠放的图。图最大为80*60
题解:
没什么好说的,模拟就完事了 。
mp[][]最后存放的图;w[]每个罐子的宽度;ve[]每个罐子上的字;ans[i]第i栈上存放的罐子id;st[i]第i栈目前最高的罐子的宽度;
h,d是每个罐子的上下界,l,r是每个罐子的左右阶,left是当前列的左边界。
kai是居中处理过后开始的行位置,o是居中处理过后的没一行字开始的列位置。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
vector<string>ve[105];
vector<int>ans[105];
int w[105],st[maxn];
char s[maxn];
char mp[1005][105];
int main()
{
int n,t,ka=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++){
ve[i].clear();
gets(s+1);
int len=strlen(s+1);
string ss="";
w[i]=0;
for(int j=1;j<=len;j++){
if(s[j]=='#'){
ve[i].push_back(ss);
int tmp=ss.length();
w[i]=max(w[i],tmp);
ss="";
}
else ss+=s[j];
}
ve[i].push_back(ss);
int tmp=ss.length();
w[i]=max(w[i],tmp);
//printf("w[%d]:%d\n",i,w[i]);
}
printf("Can Stack #%d:\n",++ka);
for(int i=1;i<=6;i++){
for(int j=1;j<10;j++){
printf(" ");
}
printf("%d",i);
}
printf("\n");
for(int i=1;i<=6;i++){
for(int j=1;j<=10;j++){
printf("%d",j%10);
}
}
printf("\n");
int now=0,mx=0;
for(int i=1;i<=n;i++){
int flag=0;
for(int j=1;j<=now;j++){
if(st[j]>w[i]){
flag=1;
ans[j].push_back(i);
st[j]=w[i];
break;
}
}
if(!flag){
now++;
ans[now].clear();
ans[now].push_back(i);
st[now]=w[i];
}
}
for(int i=1;i<=now;i++){
mx=max(mx,(int)ans[i].size());
}
mx=mx*8;
for(int i=1;i<=mx;i++)
for(int j=1;j<=60;j++) mp[i][j]=' ';
int left=1;
for(int k=1;k<=now;k++){
int l=left,r=left+w[ans[k][0]]+1;
int h=0,d=-7;
//for(int i=l;i<=r;i++) mp[h][i]=mp[d][i]='#';
//for(int i=h;i>=d;i--) mp[i][l]=mp[i][r]='#';
int y=ans[k].size();
int rr=r;
//if(y>1){
for(int i=0;i<y;i++){
int f=((r-l+1)%2)^((w[ans[k][i]])%2);
int xiao=(r-l+1-w[ans[k][i]]-2)/2;
//printf("!%d\n",xiao);
if(f){
l+=xiao;
r-=xiao;
r--;
}
else{
l+=xiao;
r-=xiao;
}
h+=8;d+=8;
int id=ans[k][i];
int hi=ve[id].size(),kai;
if(hi%2){
kai=h-(7-hi)/2;
}
else{
kai=h-(8-hi)/2;
}
for(int j=0;j<hi;j++){
int o=l+1;
int tp=ve[id][j].size();
int ff=((r-l+1)%2)^(tp%2);
if(ff){
o+=(r-l-2-tp)/2;
}
else o+=(r-l-1-tp)/2;
for(int p=0;p<ve[id][j].size();p++){
mp[kai][p+o]=ve[id][j][p];
}
kai--;
}
//printf("!%d\n",l,r,h,d);
for(int j=l;j<=r;j++) mp[h][j]=mp[d][j]='#';
for(int j=h;j>=d;j--) mp[j][l]=mp[j][r]='#';
}
//}
left=rr+2;
}
for(int i=mx;i>=1;i--){
for(int j=1;j<=60;j++){
printf("%c",mp[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}