发布时间:2019-07-31 14:18:19
学校实验楼有7名保安人员:钱、赵、孙、李、周、吴、陈。由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为合适的休息日。请编制程序,打印轮休的所有可能方案。当然使每个人都满意,例如每人选择的休息日如下:
钱:星期一、星期六
赵:星期二、星期四
孙:星期三、星期日
李:星期五
周:星期一、星期四、星期六
吴:星期二、星期五
陈:星期三、星期六、星期日
#include <stdio.h>
#include <conio.h>
#define T 7 //排班周期
#define N 7 //人员数目
#define X 1 //每人每周期可以休息X天,X<T
#define Y 1 //每天最多可以有Y人休息,Y>=N*X/T
int total=0;
void Print(int pb[][T]){
int i,j;
printf("\nXiuXi FangAn %d:\n",++total);
for(i=0;i<N;++i){
printf("%d:",i);
for(j=0;j<T;++j){
if(pb[i][j]==2)printf("%d ",j);
}
printf("\n");
}
getch();
}
int KeXing(int pb[][T],int k,int j){//检验k人员在j日期休息是否可行
int s=0,i;
for(i=0;i<T;++i)s+=(pb[k][i]==2);
if(s>X)return 0;
for(s=0,i=0;i<N;++i)s+=(pb[i][j]==2);
if(s>Y)return 0;
return 1;
}
void PaiBan(int pb[][T],int k){//给第k位人员安排休息日
int i,j;
for(j=0;j<T;++j){
if(pb[k][j]==1){//k人员愿意在j日期休息
pb[k][j]=2;
if(KeXing(pb,k,j)){
if(k==N-1){//找到一个方案
Print(pb);//输出休息方案
}else{
PaiBan(pb,k+1);
}
}
pb[k][j]=1;//准备更换下一个休息意愿日测试
}
}
}
int main(){
int i,j,pb[N][T]={0};
printf("====PaiBan XiTong====\n");
printf("XiuXi YiYuan i,j( RenYuan i=0~%d, RiQi j=0~%d, JieShu -1,-1 ):\n",N-1,T-1);
do{
scanf("%d,%d",&i,&j);
if(i>=0&&i<N&&j>=0&&j<T){
pb[i][j]=1;
}else{
break;
}
}while(1);
PaiBan(pb,0);
printf("\nGong You %d Zu FangAn.",total);
printf("\nFinished!\n");
getch();
return 0;
}