- 火车票座位分配
- 1.1【问题描述】
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。假设一节车厢有 20 排、
每一排 5 个座位。为方便起见,我们用 1 到 100 来给所有的座位编号,第一排是 1 到 5 号,第二排是 6 到
10 号,依次类推,第 20 排是 96 到 100 号。购票时,一个人可能购一张或多张票,最多不超过 5 张。如果
这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最
小的几个空座位中(不考虑是否相邻)。
1.2【基本要求】
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式:输入的第一行包含一个整数 n(1 ≤ n ≤ 100),表示购票指令的数量。第二行包含 n
个整数,每个整数 p 在 1 到 5 之间,表示要购买的票数,相邻的两个数之间使用一个空格分隔。
输出格式:输出 n 行,每行对应一条指令的处理结果。对于购票指令 p,输出 p 张车票的编号,按从
小到大排序。
样例输入:
4
2 5 4 2
样例输出:
1 2
6 7 8 9 10
11 12 13 14
3 4
样例说明:
-
购 2 张票,得到座位 1、2。
-
购 5 张票,得到座位 6 至 10。
-
购 4 张票,得到座位 11 至 14。
-
购 2 张票,得到座位 3、4。
代码如下:
package 火车票座位分配;
import java.util.Scanner;
/**
* 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
* 假设一节车厢有20排,每一排 5个座位。为方便起见,我们用 1到100来给所有的座位编号,
* 第一排是 1到 5号,第二排是 6到10号,依次类推,第 20排是96到100号。
* 购票时,一个人可能购一张或多张票,最多不超过 5张。
* 如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。
* 否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
*
* @author jingbu
*
*/
public class TicketTest {
static int time=0;//定义一个静态变量,用来记录每一排座位的个数的变化
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//输入购票指令的数量
int a=scanner.nextInt();
//只能购买1-100,不在此范围则报错
if(a<1||a>100) {
System.out.println("购票指令的数量出错");
}
//购票指令的数量对应的票的张数构成的数组
int[] arr=new int[a];
//初始化该数组
for(int i=0;i<a;i++) {
int x=scanner.nextInt();
//票的张数只能为1-5,不在此范围则报错
if(x>5||x<1) {
System.out.println("购票张数出错");
}
else {
arr[i]=x;
}
}
//将车的座位定义为二维数组,没有购票为0,否则为1
int seat[][]=new int[20][5];
//初始化该二维数组
for(int i=0;i<20;i++) {
for(int j=0;j<5;j++) {
seat[i][j]=0;
}
}
//座位分配算法
int[] temp = new int[20];// 定义一个辅助数组,记录每排已购座位的个数
//购票指令的数量决定最后输出的行数
for(int i=0;i<a;i++) {
//最后输出a行
for(int j=0;j<20;j++) {
if(arr[i]>5-temp[j]) {
continue;
}
else if(arr[i]<=5-temp[j]) {
int s=temp[j];
for(int m=temp[j];m<s+arr[i];m++) {
seat[j][m]=1;
System.out.print((5*j+m+1)+" ");
time++;
temp[j]=time;
}
System.out.println();
/*
* for(int y=0;y<5;y++) { if(seat[j][y]==1) { System.out.print((5*j+s+1)+" "); }
* } System.out.println();
*/
time=0;//将记录次数置0
break;
}
}
}
/*
* for(int i=0;i<20;i++) { for(int j=0;j<5;j++) { if(seat[i][j]==1) {
* System.out.print((5*i+j+1)+" "); } } System.out.println(); }
*/
}
}
此题难点在于输出时同一行的座位为不同行输出,具体详细看座位分配算法部分。