分享一位大神的解题,代码简洁,清晰明了
直接点这里
下面的方法实现繁琐,仅做记录
#include<stdio.h>
int main(){
int seat[20][5],num=1; //seat[][]表示座位
int empty[19],s[100]; //e[]表示某排空座位数 用s[]记录已卖出的票号
for(int i=0;i<20;i++){
for(int j=0;j<5;j++){
seat[i][j]=num++;
}
}
for(int i=0;i<20;i++) empty[i]=5; //初始时每排都有5个空座
for(int i=0;i<100;i++)s[i]=0; //s[]用来记录已经卖出的票的号码,初始时并未售票
int n,count=0,b[100]; //count用于在s[]中 数组b[]记录每次需要的座位数
scanf("%d",&n);
for(int i=0;i<n;i++){ //n次取票指令
int p;
scanf("%d",&p);
b[i]=p; //将指令序列保存在b[]中
int row=0;
while(empty[row]<p&&row<20)row++; //找到空座位数满足要求的那排
if(row<20){ //可以找到符合要求的一排座位
empty[row]-=p; //这一排的空座位数减p
for(int j=0;j<5;j++){ //找出这排的p个空座位
if(seat[row][j]!=0){ //j为p个空座位开头的位置
for(int t=0;t<p;t++){
s[count++]=seat[row][j+t]; //找到空座位则将其号码保存到s[]中
seat[row][j+t]=0; //已售出的座位号置零
}
break; //已经将p个座位卖出了,不需要进行5次for循环
}
}
}
else{ //没有p个座位靠在一块的情况,则从小到大找空座插进去
for(int z=0;z<p;z++){ //一共要找p个空座
for(int x=0;x<20;x++){ //从第一排开始寻找还未售出的座位
for(int y=0;y<5;y++){ //每排最多循环5次
if(seat[x][y]!=0){ //若这个座位还未卖出
s[count++]=seat[x][y]; //将其号码保存到s[]中
seat[x][y]=0; //已售出的座位号置零
empty[x]--; //这一排的空座位数减1
}
}
}
}
}
} //此时卖出的座位号都已经保存在s[]中
int t=0;
for(int i=0;i<n;i++) { //打印n行
for(int j=0;j<b[i];j++){ //每行b[i]个数
printf("%d ",s[t++]);
}
printf("\n"); //打印完一行需要换行 感觉这里还可以化简一下的,,,
}
return 0;
}
欢迎交流指导。