程序会从字符串数组(称之为“booking” array)处理数据。第一个数组元素将包含一个数字,表示飞机有多少座位。其余元素将包含乘客谁已预订的航班座位组的信息。该组的第一个元素是一个数字,表示有多少人在一组。其余的元素被他们的名和姓识别个别乘客在该组中。例如:阵列包含以下10行:
(txt文件:要用于导入程序中(用input导入))
8
2
Nobbly, Greg
Nobbly, Jo-Anne
1
Lee, Sook
3
Lukas, Stephie
Lukas, Cambridge
Lukas, Ogden
(有8个座位,乘客的第一组有2人,第二组有1人,而第三组有3人。)
座位图表航班将被存储在一个字符串数组(称之为“seat” array),其大小等于在飞机上的座位数。数组中的每个位置对应于一个座位; array中的第一个元素是座椅1,第二元件是座椅2,等等 。所有的座位都是空的。乘客将通过把他们的名字在这个阵列就座。
程序将:
创建适当的大小的“seat”array(在“booking”array的第一个位置)。
处理字符串的“booking”array中的剩余项目。对于每个组的乘客程序将尝试安排座位如下:
1.首先,它会查看是否有足够的剩余座位在飞机上给一个组的每个人就坐; 如果不是,它会显示错误消息,并且不把席位分配给在组中的任何人。
2.其次,将经过“seat”array,以确定是否空座多到足以容纳整个组在一起(例如,如果该组的大小为3,它会检查是否有3个连续的空座位)。(如果在array任何位置中有至少一个这样的位置的块,随机分配这个组给这些块中的一个(随机选择一个在“seat”array的中元素)如果那个座位是空的,确定是否有足够的连续数组元素(座位数)也就是整个组要坐的空座位; 如果是的话,就坐这里。否则,随机尝试另一个座位,重复直到成功为止。(注意,这不是最有效的方法...))
(如果没有这样的块,随机分别分配每个乘客到一个别的座位(即将组分拆)。对于每一个乘客,随机挑选座位号,直到找到一个空座位。)
当座位已分配完成,print 出 “seat”array 来显示内容。同时显示已有乘客的座位和空座位,描写空座为“empty”。程序将输出的每一行的座位数,其中飞机上的第一座是 (seat 1)。
(请注意,使用上述算法,乘客从未动过一次自己的座位已被分配。由于的随机选择的座椅位置的结果,一个组可能被拆分。例如,上述采样数据,可能会导致下面的输出:
Seat 1: Lukas, Ogden
Seat 2: Lee, Sook
Seat 3: -empty-
Seat 4: Lukas, Stephie
Seat 5: Nobbly, Greg
Seat 6: Nobbly, Jo-Anne
Seat 7: -empty-
Seat 8: Lukas, Cambridge
因为座椅分配的前两组留下了没有空块的三个座位,在第三组的每个人每个不得不被分配一个随机座位。如果前两个组已经就位不同,第三组可能已经能够坐在一起。)
求大神用上面说的算法写出一个JAVA程序(并不用修复最后所说的可能被拆分的问题)
------解决思路----------------------
下面的代码应该能够实现你要的功能.不过对于小数据还行,大数据如果还是用random来出来索引问题的话会有点吃力.等下再写下改进.
//package net.csdn.question;
/*
passengers.txt:
8
2
Nobbly, Greg
Nobbly, Jo-Anne
1
Lee, Sook
3
Lukas, Stephie
Lukas, Cambridge
Lukas, Ogden
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Random;
public class Test{
public static void main(String[] args){
String[][] passengers = null;
String[] seats = new String[8];
String file = "passengers.txt";
passengers = getPassengers(file);
int count = CountPassengers(passengers);
if(seats.length < count){
System.out.println("ERROR! seats.length < passengers.length");
System.exit(1);
}
seats = process(seats,passengers);
for(int i = 0 ; i < seats.length ; i ++){
System.out.println("Seat " + (i+1) + ":" + seats[i]);
}
}
public static String[][] getPassengers(String file){
return getPassengers(new File(file));
}
public static String[][] getPassengers(File file){
Scanner input = null;
try{
input = new Scanner(file);
}catch(FileNotFoundException e){
System.out.println("Can't find the file:" + file.getName());
System.exit(1);
}
int passengers_max = new Integer(input.nextLine());
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();//用于存储所有的passenger信息.
ArrayList<String> group = null;//用于存储某个group的passenger信息
String passenger = null;
//System.out.println("本班次最大可容纳" + passengers_max + "位乘客."); //这里是获取本班次最大容量
int passengers_count_inGroup = 0;
while(input.hasNext()){
passengers_count_inGroup = new Integer(input.nextLine());//这里获取对应的改组有多少的乘客数
group = new ArrayList<String>();
for(int i = 0; i < passengers_count_inGroup ; i ++){
passenger = input.nextLine();//这里获取Passenger的信息,并且添加到对应的group中
group.add(passenger);
}
list.add(group);//将对应的group添加到list中
}
int group_count = list.size();
String[][] passengers = new String[group_count][];
//这里对passengers进行赋值
for(int i = 0 ; i < passengers.length ; i ++){
group = list.remove(0);
passengers[i] = new String[group.size()];
for(int j = 0 ; j < passengers[i].length ; j ++){
passengers[i][j] = group.remove(0);
}
}
return passengers;
}
public static int CountPassengers(String[][] passengers){
int result = 0;
for(int i = 0 ; i < passengers.length ; i ++){
for(int j = 0 ; j < passengers[i].length ; j++){
result ++;
}
}
return result;
}
public static String[] process(String[] seats,String[][] passengers){
Random random = new Random();
int index;
int group = passengers.length;
int seats_length = seats.length;
int indexs[] = new int[group];
int group_passengers_length;//这个用于临时存储存在于group中的passengers的数量
//对每组的第一个乘客进行随机存储.并记录其存储的索引
for(int i = 0 ; i < group ; i ++){
index = random.nextInt(seats_length);
while(seats[index] != null){
index = random.nextInt(seats_length);
}
seats[index] = passengers[i][0];
indexs[i] = index;
}
//对剩余的passengers进行顺序存储,如不满足顺序存储则进行随机存储
for(int i = 0 ; i < group ; i ++){
group_passengers_length = passengers[i].length;
index = indexs[i];
int temp;
//以下将对group中的其他passengers进行存储
for(int j =1; j < group_passengers_length ; j ++){
if(index != seats_length - 1 && seats[index+1] == null){
seats[index+1] = passengers[i][j];
index ++;
}else{
//如果该组第一个passenger后面没有空位,那么后面的乘客将随机坐.
//所以不能改变index的值.引入temp参数来对seat[]数组进行处理
temp = random.nextInt(seats_length);
while(seats[temp] != null){
temp = random.nextInt(seats_length);
}
seats[temp] = passengers[i][j];
}
}
}
for(int i = 0 ; i < seats.length ; i ++){
if(seats[i]==null)
seats[i] = "-empty-";
}
return seats;
}
}
------解决思路----------------------
用下面的方法来获取随机的索引,要比直接使用Random然后判断是否null更加的有效率些
import java.util.Random;
import java.util.ArrayList;
public class GetRandomIndex{
public static void main(String[] args){
Random random = new Random();
String[] seats = new String[8];
ArrayList<Integer> list = new ArrayList<Integer>();
//用list来存储未使用的索引
for(int i = 0 ; i < seats.length ; i ++){
list.add(i);
}
int index = random.nextInt(list.size());
int indexInSeatsNoNull = list.remove(index);
//取出随机的一个索引,并且在list中remove
System.out.println(indexInSeatsNoNull);
}
}