您的位置:首页 > 编程语言 > C语言/C++

CCF认证 - 201609-2 - 火车购票 C语言代码实现(90分)

2019-03-10 21:37 190 查看
#include<stdio.h>
int main()
{
int n, a[100] = {0}, seat[20][5] = {0}, num, ls = 5, flag = 0, tag = 0;//数组seat表示座位的占用情况;
scanf("%d", &n);

for(int i = 0; i < n; i++)
scanf("%d", &a[i]);

int zuohao[20][5], count = 1;
for(int i = 0; i < 20; i++)
for(int j = 0; j < 5; j++)
zuohao[i][j] = count++;//数组zuohao记录座号;

for(int i = 0; i < n; i++) {
num = a[i];//num记录当前购票数;
tag = 0;
for(int h = 0; h < 20; h++)
{
for(int l = 0; l < 5; l++)
{
if(seat[h][l] == 1) {
ls--;
//continue;    //解释因为加continue而引起的错误:
//加入continue的本意是跳过当前行中
//已被占用的座位,但导致了:当一行中
//所有的位置被占满时,第18行的for循环
//直接结束,从而导致ls = 5无法执行,即
//ls无法进行初始化,导致下一次第15行for
//循环执行时,ls的值不为5,所以执行到第
//39行跳出,即少进行了一次for循环,从而
//导致了座位会空出一行。
//若不加continue,则可以达到正确结果,
//不过执行的代码也相应增多;
}//若座位被占,则当前行的剩余座位数减一;
if(ls < num)
{
ls = 5;
break;
}//若剩余座位数不足,则直接跳到下一行;
if(seat[h][l] == 0 && ls >= num)
{
for(int k = l; k < l + num; k++)
if(seat[h][k] == 1)
{
flag = 1;
break;
}
if(flag == 0) {
for(int j = l; j < l + num; j++)
{
seat[h][j] = 1;
printf("%d ", zuohao[h][j]);
tag = 1;
}//分配座位;
printf("\n");
ls = 5;
}

}
flag = 0;
if(tag == 1)
break;//tag为1说明当前座位分配完成,可以进行下一个分配;
}
if(tag == 1)
break;//tag为1说明当前座位分配完成,可以进行下一个分配;
}
}
/*	for(int i = 0; i < 20; i++)
{
for(int j = 0; j < 5; j++)
printf("%d ", seat[i][j]);
printf("\n");
}*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: