c代码实现:某单位有7名保安人员,要求每个人在一星期中可以休息一天。每名保安可以自行选择自己想要的休息日,而对于休息日的选择既可以是某一天,也可以是某几天中的其中一天。当7名保安依次输入自己想要的休息日后,系统将会给出可能的值班安排。若系统给出的值班安排是0种,证明系统对7名保安的选择无法作出排班,需要重新输入。(3)当有某个保安请假一周,即剩下的6名保安有一个人一周要值两天时如何排班。
时间: 2024-02-03 09:15:22 浏览: 30
1. 不考虑请假情况下的排班:
```c
#include <stdio.h>
void printSchedule(int schedule[][7]) {
printf("Possible schedules are:\n");
for (int i = 0; i < 7; i++) {
printf("Schedule %d: ", i + 1);
for (int j = 0; j < 7; j++) {
if (schedule[i][j] == 1) {
printf("%d ", j + 1);
}
}
printf("\n");
}
}
int main() {
int restDays[7][7] = {0}; // 记录每个人的休息日
int schedule[128][7] = {0}; // 记录可能的值班安排,最多有2^7种
int cnt = 0; // 记录可能的值班安排数量
printf("Please input the rest days for 7 security guards.\n");
for (int i = 0; i < 7; i++) {
printf("Security guard %d: ", i + 1);
int restDay;
while (scanf("%d", &restDay) != EOF && restDay != -1) {
restDays[i][restDay - 1] = 1; // 标记为休息日
}
getchar(); // 读掉回车符
}
// 枚举所有可能的值班安排
for (int i = 0; i < 128; i++) {
int sum[7] = {0}; // 记录每天被选中的人数
for (int j = 0; j < 7; j++) {
if ((i >> j) & 1) { // 二进制表示中第j位是1,表示第j个人值班
for (int k = 0; k < 7; k++) {
if (!restDays[j][k]) { // 第j个人在第k天不休息
sum[k]++;
}
}
}
}
int flag = 1;
for (int j = 0; j < 7; j++) {
if (sum[j] == 0 || sum[j] > 2) { // 每天至少有一个人值班,最多有两个人值班
flag = 0;
break;
}
}
if (flag) {
for (int j = 0; j < 7; j++) {
schedule[cnt][j] = (i >> j) & 1;
}
cnt++;
}
}
if (cnt == 0) {
printf("No possible schedules.\n");
} else {
printSchedule(schedule);
}
return 0;
}
```
2. 有一个保安请假一周时的排班:
可以先按照不请假时的方法生成可能的排班方案,然后再针对有一个保安请假的情况进行筛选。如果剩下的6名保安中有一个人要值两天,那么就需要找到一种排班方案,使得这个人值班的天数尽可能少。
```c
#include <stdio.h>
void printSchedule(int schedule[][7]) {
printf("Possible schedules are:\n");
for (int i = 0; i < 7; i++) {
printf("Schedule %d: ", i + 1);
for (int j = 0; j < 7; j++) {
if (schedule[i][j] == 1) {
printf("%d ", j + 1);
}
}
printf("\n");
}
}
int main() {
int restDays[7][7] = {0}; // 记录每个人的休息日
int schedule[128][7] = {0}; // 记录可能的值班安排,最多有2^7种
int cnt = 0; // 记录可能的值班安排数量
printf("Please input the rest days for 7 security guards.\n");
for (int i = 0; i < 7; i++) {
printf("Security guard %d: ", i + 1);
int restDay;
while (scanf("%d", &restDay) != EOF && restDay != -1) {
restDays[i][restDay - 1] = 1; // 标记为休息日
}
getchar(); // 读掉回车符
}
// 枚举所有可能的值班安排
for (int i = 0; i < 128; i++) {
int sum[7] = {0}; // 记录每天被选中的人数
for (int j = 0; j < 7; j++) {
if ((i >> j) & 1) { // 二进制表示中第j位是1,表示第j个人值班
for (int k = 0; k < 7; k++) {
if (!restDays[j][k]) { // 第j个人在第k天不休息
sum[k]++;
}
}
}
}
int flag = 1;
for (int j = 0; j < 7; j++) {
if (sum[j] == 0 || sum[j] > 2) { // 每天至少有一个人值班,最多有两个人值班
flag = 0;
break;
}
}
if (flag) {
for (int j = 0; j < 7; j++) {
schedule[cnt][j] = (i >> j) & 1;
}
cnt++;
}
}
if (cnt == 0) {
printf("No possible schedules.\n");
return 0;
}
// 找到一名保安要值两天的排班方案
int minDays = 7;
int selected = -1;
for (int i = 0; i < 7; i++) {
int days = 0;
for (int j = 0; j < cnt; j++) {
if (schedule[j][i]) {
days++;
}
}
if (days < minDays) {
minDays = days;
selected = i;
}
}
// 从符合要求的排班方案中选出一种
int selectedSchedule[7] = {0};
for (int i = 0; i < cnt; i++) {
if (schedule[i][selected]) {
int sum = 0;
for (int j = 0; j < 7; j++) {
if (schedule[i][j]) {
sum++;
}
}
if (sum == 2) {
for (int j = 0; j < 7; j++) {
selectedSchedule[j] = schedule[i][j];
}
break;
}
}
}
if (selectedSchedule[0] == 0) {
printf("No possible schedules.\n");
} else {
printSchedule(&selectedSchedule);
}
return 0;
}
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)