做的时候又是粗心了,少看了题目条件……搞了一会儿……
AC代码:
#include<iostream> #include<stdio.h> #include<cstdlib> #include<cmath> using namespace std; int main(){ int n,g; int f[21],w[101][6],v[21][6];//f用来记录每行未用个数,v用来标记已用位置,w用来存储答案 scanf("%d",&n); for(int i=0;i<21;i++) f[i]=5; for(int i=0;i<20;i++) for(int j=0;j<6;j++) v[i][j]=0; for(int i=0;i<101;i++) for(int j=0;j<6;j++) w[i][j]=0; for(int i=0;i<n;i++){ int flag=0;//用来判断是否可放在整行里 scanf("%d",&g); for(int j=0;j<20&&g>0;j++)//行 if(f[j]-g>=0){ int x=0; flag=1; for(int k=0;g>0;k++)//列 if(v[j][k]==0){ v[j][k]=1; f[j]--; w[i][x]=j*5+k+1; g--; x++; } } if(flag==0){ int x=0; for(int j=0;j<20&&g>0;j++) if(f[j]!=0){ for(int k=0;k<5&&g>0;k++) if(v[j][k]==0){ v[j][k]=1; f[j]--; w[i][x]=j*5+k+1; g--; x++; } } } } for(int i=0;i<n;i++){ if(w[i][0]!=0) printf("%d",w[i][0]); for(int j=1;j<5;j++) if(w[i][j]!=0) printf(" %d",w[i][j]); printf("\n"); } return 0; }