#include<stdio.h> //应当设立一个结构体 其中变量m表示该排是否满了 ,A[i]表示i坐位是否已经被占
struct sit{
int A[5];
int m;
};
int main() {
int n,i=0,a,c,j=0,k=0,key=0,A[100];
struct sit B[20]; //设置20个结构体数组,在100中的序号用i*5表示
scanf("%d",&n); //n中存放买票人的数量
while(i<n){ // A[i]表示第i个人买了多少 票 注:区别结构体中的A[i]
scanf("%d",&A[i]);
i++;
}
for(i=0;i<20;i++){ //对结构体数组进行初始化
B[i].m=5;
for(j=0;j<5;j++){
B[i].A[j]=0; //表示第i排的第j个坐位未被购买
}
}
a=0;
while(a<100){ //关键步骤:每次循环都代表一个人已经找够了坐位,若所有人都找够了坐位,退出循环
i=0;
while(i<20&&k<n){ //开始找坐位 用key表示第一次找是否能找到
key=0;
if(B[i].m>=A[k]){ //如果某一排有足够多的坐位
for(j=0;j<5&&A[k]>0;j++){ //开始占座
if(B[i].A[j]==0){
B[i].A[j]=1;
printf("%d ",i*5+j+1);
A[k]--;
B[i].m--;
}
}
printf("\n");
k++;
key=1;
i=0; //已经找到了坐位换下一个人从头开始遍历
}
if(key==0){
i++;
}
}
if(i==20&&key==0&&k<n){ //如果遍历结束还没找到坐位
for(i=0;i<20;i++){ //从头按顺序坐
for(j=0;j<5&&B[i].m>0;j++){
if(B[i].A[j]==0){
B[i].A[j]=1;
B[i].m--;
c=i*5+j+1;
printf("%d ",i*5+j+1);
A[k]--;
if(A[k]==0) break;
}
}
if(A[k]==0){ //票如果买够了
key=1;
printf("\n");
break;
}
}
k++;
}
if(k>=n){
break;
}
else{
a++;
}
}
return 0;
}
CCF201609-2 火车购票(100分)c语言实现
最新推荐文章于 2021-05-17 15:30:26 发布