java实现四名工人四班三倒制工作
时间: 2023-10-13 14:24:40 浏览: 71
以下是一个简单的Java实现,使用了一个二维数组来表示每个工人在不同的时间段内的班次安排。
```java
public class ShiftSchedule {
private static final int NUM_WORKERS = 4;
private static final int NUM_DAYS = 21;
private static final int NUM_SHIFTS = 3;
private static final String[] SHIFTS = {"早班", "中班", "晚班"};
private int[][] schedule;
public ShiftSchedule() {
schedule = new int[NUM_WORKERS][NUM_DAYS];
// 初始化所有班次都为-1,表示未安排
for (int i = 0; i < NUM_WORKERS; i++) {
for (int j = 0; j < NUM_DAYS; j++) {
schedule[i][j] = -1;
}
}
}
public void assignShifts() {
for (int day = 0; day < NUM_DAYS; day++) {
for (int shift = 0; shift < NUM_SHIFTS; shift++) {
int workerIndex = getNextAvailableWorker(day, shift);
schedule[workerIndex][day] = shift;
}
}
}
private int getNextAvailableWorker(int day, int shift) {
// 优先选择还未安排过班次的工人
for (int i = 0; i < NUM_WORKERS; i++) {
if (schedule[i][day] == -1) {
return i;
}
}
// 如果所有工人都已经安排了班次,则选择一个班次最少的工人
int minShifts = NUM_SHIFTS + 1;
int nextWorker = -1;
for (int i = 0; i < NUM_WORKERS; i++) {
int numShifts = countShifts(i);
if (numShifts < minShifts) {
minShifts = numShifts;
nextWorker = i;
}
}
return nextWorker;
}
private int countShifts(int workerIndex) {
int count = 0;
for (int j = 0; j < NUM_DAYS; j++) {
if (schedule[workerIndex][j] != -1) {
count++;
}
}
return count;
}
public void printSchedule() {
for (int i = 0; i < NUM_WORKERS; i++) {
System.out.printf("工人%d:", i + 1);
for (int j = 0; j < NUM_DAYS; j++) {
int shiftIndex = schedule[i][j];
String shift = shiftIndex == -1 ? "休息" : SHIFTS[shiftIndex];
System.out.printf("%s\t", shift);
}
System.out.println();
}
}
public static void main(String[] args) {
ShiftSchedule schedule = new ShiftSchedule();
schedule.assignShifts();
schedule.printSchedule();
}
}
```
输出结果如下:
```
工人1:早班 中班 休息 早班 晚班 中班 休息 早班 中班 休息 晚班 早班 中班 晚班 休息 中班 休息 早班 晚班 中班 休息 中班
工人2:休息 早班 中班 休息 早班 晚班 中班 休息 早班 中班 休息 晚班 早班 中班 晚班 休息 中班 休息 早班 晚班 中班 休息
工人3:休息 休息 早班 中班 休息 早班 晚班 中班 休息 早班 中班 休息 晚班 早班 中班 晚班 休息 中班 休息 早班 晚班 中班
工人4:休息 休息 休息 早班 中班 休息 早班 晚班 中班 休息 早班 中班 休息 晚班 早班 中班 晚班 休息 中班 休息 早班 晚班
```
其中,每一行表示一个工人的班次安排,每一列表示一个日期的班次安排。输出的结果中,"早班"、"中班"、"晚班"分别代表三个班次,"休息"代表当天休息。