0
点赞
收藏
分享

微信扫一扫

课设作业1.0——火车票分配问题详解

王老师说 2022-04-24 阅读 58
java

目录

 1.题目

2.基本要求

3.思路

4.代码

5.输出结果

6.知识点


 1.题目

  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。假设一节车厢有20排,每一排 5个座位。为方便起见,我们用 1到100来给所有的座位编号,第一排是 1到 5号,第二排是 6到10号,依次类推,第 20排是96到100号。购票时,一个人可能购一张或多张票,最多不超过 5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。

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。

3.思路

输入买票人数(ticketNumber)——》

一维数组(purchase[ticketNumber]=x)输入每次购票数量()——》

二维数组(seat[20][6])设置座位数——》

设置 i ,用来for循环(1~20)seat.length==20——》

输入每行座位的剩余数(seat[i][5])——》

先排可以相邻的——》

判断下一个人,能否利用上一排的空位(residue=seat[i][5])(即5-x)——》

直到20排都无剩余连续座位——》

再排不能连续的(x>residue)——》

直到此人买完(x=0)

4.代码

​
import java.util.Scanner;

public class TicketTest {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int ticketNumber=input.nextInt();//买票次数
        int[] purchase=new int[100];//购票数量
        for(int i=0;i<ticketNumber;i++){
            purchase[i]=input.nextInt();//每次购多少
        }
        int[][] seat=new int[20][6];//20排,5列+显示剩余座位的一列
        for(int i=0;i<seat.length;i++){//循环20行
            seat[i][5]=5;//表示还没选座位时,每行空五个座位
        }
        for(int i=0;i<ticketNumber;i++){
            int x=purchase[i];  //存储购票数量
            boolean flag=false;//判断成功与否
            //开始分配座位
            for(int j=0;j<seat.length;j++){//从第一行开始,在20行中找可连续的座位
                int residue=seat[j][5];//存储每行剩余数量 residue:剩余数量
                //开始分配
                if(residue>=x){//当剩余数量大于购买数量
                    int startSeat=5-residue;//记录每行开始位置
                    seat[j][5]=seat[j][5]-x;//分配以后剩余数量变化
                    flag=true;//分配成功
                    for(int k=startSeat;k<startSeat+x;k++){
                        System.out.print(k+j*5+1+" ");
                    //开始位置+行数*5+1(因为数组每行从0开始,所以加1)
                    }
                    System.out.println();
                    break;
      //结束本次分配座位,开始下一次分配,若不添加,就会开始往下寻找每一个能满足本次要求的座位

                }
            }
        //20行都没有连续的座位了,按剩余的座位,分开坐
            if(!flag){
                for(int j=0;j<seat.length;j++){
                   int residue=seat[j][5];
                   while(x>residue&&seat[j][5]>0){
                       int k=5-seat[j][5];//该行剩余座位的最小位置
                       seat[j][5]=seat[j][5]-1;//座位是一个个分配的
                       System.out.print(k+j*5+1+" ");
                       x--;//当前待分配的座位减一
                   }
                   if(x==0){
                       break;
                   }
                }
                System.out.println();//本次结束,换行
            }

        }
  }




    public static void main2(String[] args) {
        int[][]zw=new int[20][6];
        for (int i = 1; i < zw.length; i++) {
            for (int j = 1; j <6 ; j++) {
                System.out.print(i*j+" ");
            }
            System.out.println();
            //想要理解上段代码,必须先知道2层循环中,每次循环分别代表什么意思,行?还是列?
        }
    }

}

​

5.输出结果

 

6.知识点

1.输入输出

2.数组与2维数组

3.双层循环每层表示的意义

4.break的正确使用

举报

相关推荐

0 条评论