之前在考慮問題時忽略了類似于這種情況:
假如有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");
}*/
}