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

#include
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");
	}*/ 
}

你可能感兴趣的:(初学算法)