课程设计实验--火车票座位分配

  1. 火车票座位分配
  2. 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
    样例说明:
  1. 购 2 张票,得到座位 1、2。

  2. 购 5 张票,得到座位 6 至 10。

  3. 购 4 张票,得到座位 11 至 14。

  4. 购 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(); }
		 */
		
		

	}

}

在这里插入图片描述
此题难点在于输出时同一行的座位为不同行输出,具体详细看座位分配算法部分。

  • 8
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值