CCF201609-2 火车购票(100分)c语言实现

3 篇文章 0 订阅
2 篇文章 0 订阅
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值