CCF认证 - 201609-2 - 火车购票 C语言代码实现(100分)
2019-03-10 22:39
141 查看
之前在考虑问题时忽略了类似于这种情况:
假如有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"); }*/ }
相关文章推荐
- CCF认证 - 201403-2 -窗口(C语言代码实现)(100分)
- CCF认证 - 201412-2 - Z字形扫描 (C语言代码实现)(100分)
- CCF Python题解(100分)201609-2 火车购票
- CCF CSP 201609-2 火车购票(Java-100分)
- CCF认证 - 201604-2 - 俄罗斯方块 C语言代码实现 (90分)
- CCF认证 - 201709-2 - 公共钥匙盒 C++代码实现 (plus 详细注释)(100分)
- CCF认证 - 201512-2 -消除类游戏 (C语言代码实现)(90分)
- CCF认证 - 201503-2 - 数字排序 (C++代码实现)(100分)
- 七大查找算法(附C语言代码实现)
- 用C语言实现禁用网卡的代码
- C语言顺序表实现代码排错
- 6.S5PV210时钟初始化c语言实现代码
- C语言实现修改文本文件中特定行的实现代码
- 线性表的顺序存储结构的常见操作(C语言代码实现)
- PAT 1065单身狗的代码实现及错误分析(C语言)
- C语言简单实现sizeof功能代码
- 几个基本排序算法的代码实现(C语言)
- C语言实现修改文本文件中特定行的实现代码(百度一天没找到,bing搜索十分钟就找到了)
- 201609-2 火车购票
- 三次样条插值(Cubic Spline Interpolation)及代码实现(C语言)