编制排班系统请用c语言作答

img


请用c语言来作答,并作出流程图!,。,!?,!?!,?。。??

#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;
}

img

周末公休日,即周一至周日均要上班,因此需要实行员工轮休制度.每天安排两人休息,一星期中每人只能休息一天.
应该怎么理解呢?
第一种理解:周末轮休,也就是周六两人周天两人。周内全员上班。
第二种理解:周一到周日,每天两人轮休。有一天不排轮休。
第三种理解:将每天两人轮休的条件改为每天最多两人轮休。

第三种理解更合理,也给员工留了更大的选择空间。以下根据第三种理解给出解决方案

输入: 按照工号依次输入员工预期轮休日(0-6 对应星期日-星期六, -1表示不选择)int predict[12]
输出: 可选的排班表 result[7][2]

排班冲突的解决,随机选一个为冲突时间段,其余人随机分配

排休

img

#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;
}