天天看點

CCF認證 - 201609-2 - 火車購票 C語言代碼實作(100分)

之前在考慮問題時忽略了類似于這種情況:

假如有21人購票,每個人買四張票,那麼之前的90分代碼會導緻第21人無法購買成功,

這是因為for(h = 0; h < 20; h++)該層循環在h到達20後不再繼續,事實上第21人的四張票仍

然能夠以散座的形式出售,是以導緻代碼錯誤。

在for(int i = 0; i < n; i++)與for(h = 0; h < 20; h++)兩個循環之間加入下列代碼段:

if(tag == 0 && h == 20)// (容易忽略的地方!!!)此時周遊數組未能找到能坐下的行,則應分散座位;
				 for(int hang = 0; hang < 20; hang++)
				 {
					for(int lie = 0; lie < 5; lie++)
					 	{
						 	if(seat[hang][lie] == 0)
							 	{
							 		seat[hang][lie] = 1;
							 		printf("%d ", zuohao[hang][lie]);
							 		num--;
								 } 
							if(num == 0)
								break;
						}
					if(num == 0)
						{
							printf("\n");
							break;
						}
				} 
           

對超過20人的情況進行讨論,之後便可以完成散座的出售。

#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);
	int h;
	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(h = 0; h < 20; h++) {
			for(int l = 0; l < 5; l++) {
				if(seat[h][l] == 1) {
					ls--;
					//continue;    //解釋因為加continue而引起的錯誤:
					//加入continue的本意是跳過目前行中
					//已被占用的座位,但導緻了:當一行中
					//所有的位置被占滿時,第17行的for循環
					//直接結束,進而導緻ls = 5無法執行,即
					//ls無法進行初始化,導緻下一次第15行for
					//循環執行時,ls的值不為5,是以執行到第
					//41行跳出,即少進行了一次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說明目前座位配置設定完成,可以進行下一個配置設定;
			
		}
		if(tag == 0 && h == 20)// (容易忽略的地方!!!)此時周遊數組未能找到能坐下的行,則應分散座位;
				 for(int hang = 0; hang < 20; hang++)
				 {
					for(int lie = 0; lie < 5; lie++)
					 	{
						 	if(seat[hang][lie] == 0)
							 	{
							 		seat[hang][lie] = 1;
							 		printf("%d ", zuohao[hang][lie]);
							 		num--;
								 } 
							if(num == 0)
								break;
						}
					if(num == 0)
						{
							printf("\n");
							break;
						}
				} 
	}
		/*for(int i = 0; i < 5; i++)
		{
			for(int j = 0; j < 5; j++)
				printf("%d ", seat[i][j]);
			printf("\n");
		}*/ 
}