【编程题】(满分32分)
某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。
上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。
此外,由于工作需要,还有如下要求:
1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
2. 一周中,至少有3天所有人都是上班的。
3. 任何一天,必须保证 A B C D 中至少有2人上班。
4. B D E 在周日那天必须休息。
5. A E 周三必须上班。
6. A C 一周中必须至少有4天能见面(即同时上班)。
你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0
A B C D E 每人占用1行记录,从星期一开始。
【输入、输出格式要求】
程序没有输入,要求输出所有可能的方案。
每个方案是7x5的矩阵。只有1和0组成。
矩阵中的列表示星期几,从星期一开始。
矩阵的行分别表示A,B,C,D,E的作息时间表。
多个矩阵间用空行分隔开。
例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。
0110111
1101110
0110111
1101110
输出:
某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。
上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。
此外,由于工作需要,还有如下要求:
1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
2. 一周中,至少有3天所有人都是上班的。
3. 任何一天,必须保证 A B C D 中至少有2人上班。
4. B D E 在周日那天必须休息。
5. A E 周三必须上班。
6. A C 一周中必须至少有4天能见面(即同时上班)。
你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0
A B C D E 每人占用1行记录,从星期一开始。
【输入、输出格式要求】
程序没有输入,要求输出所有可能的方案。
每个方案是7x5的矩阵。只有1和0组成。
矩阵中的列表示星期几,从星期一开始。
矩阵的行分别表示A,B,C,D,E的作息时间表。
多个矩阵间用空行分隔开。
例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。
0110111
1101110
0110111
1101110
1110110
java代码如下:
//排日程
public class js_cgz_05 {
private static int[][] types;
public static void main(String[] args) {
//根据条件:
//1.必须工作5天,休息2天
//2.不能连续工作超过3天
//根据以上两个条件可以确定每个人的时间安排只可能有7种可能
//即以下这七种情况:(0表示休息,1表示上班)
// 0 1 1 1 0 1 1
// 1 0 1 1 1 0 1
// 1 1 0 1 1 1 0
// 0 1 1 0 1 1 1
// 1 0 1 1 0 1 1
// 1 1 0 1 1 0 1
// 1 1 1 0 1 1 0
types=new int[7][7];
int j=0;
//初始化types数组,i表示第一个0出现的下标,j表示第二个0出现的下标
for(int i=0;i<7;i++){
j=(i+4)%7;
for(int t=0;t<7;t++){
if(t==i||t==j){
types[i][t]=0;
}else{
types[i][t]=1;
}
}
}
//types初始化结束
//测试所有情况,每个人都可以从7种可能的工作情况中选一种,所以一共有5^7种可能
for(int a=0;a<7;a++){//a=i表示A采用第i种工作情况
// A周三必须上班
if(types[a][2]==0)continue;
for(int b=0;b<7;b++){
// B在周日那天必须休息
if(types[b][6]==1)continue;
for(int c=0;c<7;c++){
// A C 一周中必须至少有4天能见面(即同时上班)
if(!validateAC(a, c))continue;
for(int d=0;d<7;d++){
//D在周日那天必须休息
if(types[d][6]==1)continue;
//任何一天,必须保证ABCD中至少有2人上班
if(!validateABCD(a, b, c, d))continue;
for(int e=0;e<7;e++){
//E 周三必须上班,周日那天必须休息
if(types[e][2]==0||types[e][6]==1)continue;
// 一周中,至少有3天所有人都是上班的
if(!validateAll(a, b, c, d, e))continue;
print(a, b, c, d, e);
}
}
}
}
}
}
//判断ABCD每天是否至少有2人上班,是返回true,否返回false
public static boolean validateABCD(int a,int b,int c,int d){
for(int i=0;i<7;i++){
if(types[a][i]+types[b][i]+types[c][i]+types[d][i]<2)return false;
}
return true;
}
//判断一周中是否至少有3天所有人都是上班的
public static boolean validateAll(int a,int b,int c,int d,int e){
int days=0;
for(int i=0;i<7;i++){
if(types[a][i]+types[b][i]+types[c][i]+types[d][i]+types[e][i]==5)days++;
}
return days>=3;
}
//判断一周中是否A,C至少有4天能见面
public static boolean validateAC(int a,int c){
int days=0;
for(int i=0;i<7;i++){
if(types[a][i]+types[c][i]==2)days++;
}
return days>=4;
}
//打印结果
public static void print(int a,int b,int c,int d,int e){
for(int i=0;i<7;i++)System.out.print(types[a][i]);
System.out.println();
for(int i=0;i<7;i++)System.out.print(types[b][i]);
System.out.println();
for(int i=0;i<7;i++)System.out.print(types[c][i]);
System.out.println();
for(int i=0;i<7;i++)System.out.print(types[d][i]);
System.out.println();
for(int i=0;i<7;i++)System.out.print(types[e][i]);
System.out.println();
System.out.println();
}
}
输出:
0111011
1110110
0111011
1110110
1110110
1011101
1110110
1011101
1110110
1110110
0110111
1101110
0110111
1101110
1110110
1011011
1110110
1011011
1110110
1110110