分析:
按题意,直观地建立结构体数组表示每排座位,结构体中建立数组表示每个座位,同时设置一个empty_seat变量便于判断此排是否有空座位。
每次均从第一排开始向后处理当前需求,如果当前20排都不能满足连座需求,则按座位号由小到大来处理需求,建立enough变量来判断当前20排中是否有满足连座需求的排。
代码如下:
#include <stdio.h>
#define MAX_seat 5
#define MAX_row 20
typedef struct SEAT{
int row[MAX_seat];
int empty_seat;
}Seat;
int main(){
int i,j,k,n,p,enough;
scanf("%d",&n);
Seat seat[MAX_row];
for(i=0;i<MAX_row;i++){
for(j=0;j<MAX_seat;j++)
seat[i].row[j]=i*MAX_seat+j+1;
seat[i].empty_seat=5;
}
for(i=0;i<n;i++){
scanf("%d",&p);
enough=0;
for(j=0;j<MAX_row;j++){
if(p<=seat[j].empty_seat){
seat[j].empty_seat-=p;
enough=1;
for(k=0;k<MAX_seat;k++){
if(seat[j].row[k]!=0&&p){
p--;
printf("%d ",seat[j].row[k]);
seat[j].row[k]=0;
}
}
}
}
//同排的连座不够,按最小编号空座安排
if(enough==0){
for(j=0;j<MAX_row;j++){
if(seat[j].empty_seat!=0)
for(k=0;k<MAX_seat;k++){
if(seat[j].row[k]!=0&&p){
printf("%d ",seat[j].row[k]);
seat[j].row[k]=0;
p--;
seat[j].empty_seat--;
}
}
}
}
printf("\n");
}
return 0;
}