细节很多,改了好久。。
/* 按阶梯状贪心填入字符,当第k行被填满后,再去填其他空位 */ #include<bits/stdc++.h> using namespace std; #define N 2005 char s[N*N],t[N*N],ans[N][N]; int n,l,k,len; int main(){ cin>>n>>l>>k; scanf("%s",s+1); len=n*l; memcpy(t,s,sizeof s); sort(t+1,t+1+len); int p=0; if(k==1){//特殊情况 for(int i=1;i<=n;i++){ for(int j=1;j<=l;j++) cout<<t[++p]; puts(""); } } int up=1,right=1; while(1){ for(int i=up;i<=k;i++) ans[i][right]=t[++p]; for(int i=k;i>=up+1;i--) if(ans[i][right]!=ans[i-1][right]){ up=i;break; } if(up==k||right==l)break; right++; } for(int j=1;j<=l;j++) if(ans[k][j]==0)ans[k][j]=t[++p]; for(int i=1;i<=n;i++) for(int j=1;j<=l;j++) if(ans[i][j]==0)ans[i][j]=t[++p]; for(int i=1;i<=n;i++)cout<<(ans[i]+1)<<' '; }