#include<stdio.h>
int day[7][2],person[12],d[7],p_len=0;
int key[520][7][2],k_Num=0;
bool p_Flag[12];
void flag(int today){
// printf("%d %d %d %d %d %d\n",p_Flag[0],p_Flag[1],p_Flag[2],p_Flag[3],p_Flag[4],p_Flag[5]);
if(today>=7){
for(int z=0;z<p_len;z++) if(!p_Flag[z]) return;
for(int z=0;z<7;z++) for(int z1=0;z1<2;z1++) key[k_Num][z][z1] = day[z][z1];
k_Num++;
return;
}
if(d[today]==2){
flag(today+1);
return;
}
if(d[today]==0)
{
for(int z=0;z<p_len-1;z++){
if(p_Flag[z]) continue;
p_Flag[z] = true;
day[today][0] = person[z];
for(int z1=z+1;z1<p_len;z1++){
if(p_Flag[z1]) continue;
p_Flag[z1] = true;
day[today][1] = person[z1];
flag(today+1);
p_Flag[z1] = false;
day[today][1] = 0;
}
day[today][0] = 0;
p_Flag[z] = false;
}
}
for(int z=0;z<p_len;z++){
if(p_Flag[z]) continue;
p_Flag[z] = true;
day[today][1] = person[z];
flag(today+1);
day[today][1] = 0;
p_Flag[z] = false;
}
}
int main()
{
// 本人自己设定的额外条件不然这题太ex了
// 1 : 编号越小的表示员工越老,当同一天内多人需要调休时,优先调休年轻的
// 2 : 在调休的同时保证场内每天在的员工数量尽可能的平均(比如剩余2天,有俩人需要调休,那就安排一人休息一天,保证劳动力尽量不要出现短缺)
// 3 : 休息样表输出000表示无人
int rest;
// 请按顺序输入编号1-12的人自己想要休息的时间 (0-6 : 星期1-7)
for(int z=1;z<=12;z++){
scanf("%d",&rest);
if(d[rest]<2) day[rest][d[rest]++] = z;
else person[p_len++] = z;
}
// 需要调秀的人数
printf("%d\n",p_len);
// 需要调休的人编号输出
for(int z=0;z<p_len;z++) printf("%d ",person[z]);
printf("\n");
// 还没安排调休人员的安排表
for(int z=0;z<7;z++) printf("%d : %03d %03d\n",z,day[z][0],day[z][1]);
putchar('\n');
flag(0);
for(int z=0;z<k_Num;z++){
printf("case :%d\n",z);
for(int z1=0;z1<7;z1++)
{
printf("%d : %03d %03d\n",z1,key[z][z1][0],key[z][z1][1]);
}
printf("\n");
}
if(k_Num==0) printf("无需调休");
return 0;
}
周末公休日,即周一至周日均要上班,因此需要实行员工轮休制度.每天安排两人休息,一星期中每人只能休息一天.
应该怎么理解呢?
第一种理解:周末轮休,也就是周六两人周天两人。周内全员上班。
第二种理解:周一到周日,每天两人轮休。有一天不排轮休。
第三种理解:将每天两人轮休的条件改为每天最多两人轮休。
第三种理解更合理,也给员工留了更大的选择空间。以下根据第三种理解给出解决方案
输入: 按照工号依次输入员工预期轮休日(0-6 对应星期日-星期六, -1表示不选择)int predict[12]
输出: 可选的排班表 result[7][2]
排班冲突的解决,随机选一个为冲突时间段,其余人随机分配
排休
#include <stdio.h>
int main()
{
int num=12;
int day=90;
int count=0;
int rest[12]= {0};
char t[num][6]=
{
"001","002","003","004","005","006",
"007","008","009","010","011","012"
};
while(count<day)
{
int min=rest[0];
int minp=0;
for(int i=1; i<num; i++)
{
if(rest[i]<min)
{
min=rest[i];
minp=i;
}
}
if((count)%7==0||count==0)
{
printf("\n第%d个星期排休:",count/7+1);
}
printf("%s ",t[minp]);
rest[minp]++;
count++;
}
printf("\n\n");
for(int j=0; j<num; j++)
{
printf("%s号员工休息了%d天\n",t[j],rest[j]);
}
return 0;
}
某生产车间有12 名员工,编号为: 001、002、003、… 012。由于工作需要,
在生产旺季取消了周末公休日,即周一至周日均要上班,因此需要实行员工轮休制度。每天安排两人休息,一星期中每人只能休息一天。每个员工可以预先自认为合适的休息日。
#include <stdio.h> //用来输入输出
#include <time.h> //用来辅助产生随机数
#include <stdlib.h> //使用rand()函数
int main()
{
int people[12] = {0}; //用来表示这个人选的天数
int day[7] = {0}; //用来表示这天有多少个人选中了
int num[12] = {0},randnum; //用来表示编号选择状态
int input; //用来存放输入的天数
int count = 1; //计数变量
int i,j; //for循环的控制变量
int exit; //用来控制用户退出
srand(time(NULL)); //随机数初始化
while(count <= 12) //人数控制
{
while(num[randnum-1]) //重复执行直到随机出没有选择过休息天数的人
randnum = (rand() % 12)+ 1;
if(randnum < 10)
printf("请编号为00%d员工选择一个自认为合适的休息日:",randnum);
else
printf("请编号为0%d员工选择一个自认为合适的休息日:",randnum);
scanf("%d",&input);
if(input >= 1 && input <= 7 && day[input - 1] < 2)//判断是否天数已满或者输入天数不规范
{
count++;
day[input - 1]++;
num[randnum-1]++;
people[randnum-1] = input;
}
}
printf("\n ");
for(i = 0 ; i < 12 ; i++) //按照编号顺序输出
if(i < 9)
printf("00%d ",i + 1);
else
printf("0%d ",i + 1);
putchar('\n');
for(i = 0 ; i < 12 ; i++)
printf("星期%d ",people[i]);
putchar('\n');
for(i = 0;i < 7; i++) //按照星期数输出
{
printf("星期%d:",i + 1);
for(j = 0 ; j < 12 ; j++)
if(people[j] == i + 1)
if(j + 1 < 10)
printf("00%d ",j + 1);
else
printf("01%d ",j - 10 + 1);
putchar('\n');
}
printf("请输入0以退出程序");
scanf("%d",&exit);
while(exit != 0)
scanf("%d",&exit);
return 0;
}