某保密单位机要人员 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
#include <stdio.h>
//每人工作安排只有七种情况
void Assignment(int *a, int i)
{
switch (i)
{
case 1:
a[0] = 0; a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 1; a[5] = 1; a[6] = 1;
break;
case 2:
a[0] = 0; a[1] = 1; a[2] = 1; a[3] = 1; a[4] = 0; a[5] = 1; a[6] = 1;
break;
case 3:
a[0] = 1; a[1] = 1; a[2] = 0; a[3] = 1; a[4] = 1; a[5] = 1; a[6] = 0;
break;
case 4:
a[0] = 1; a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 1; a[5] = 1; a[6] = 0;
break;
case 5:
a[0] = 1; a[1] = 0; a[2] = 1; a[3] = 1; a[4] = 1; a[5] = 0; a[6] = 1;
break;
case 6:
a[0] = 1; a[1] = 0; a[2] = 1; a[3] = 1; a[4] = 0; a[5] = 1; a[6] = 1;
break;
case 7:
a[0] = 1; a[1] = 1; a[2] = 0; a[3] = 1; a[4] = 1; a[5] = 0; a[6] = 1;
break;
}
}
int main()
{
int a[5][7], i, j, k, l, m, x, y, n, q;
for (i = 1; i <= 7; i++)
{
Assignment(a[0], i);
for (j = 1; j <= 7; j++)
{
Assignment(a[1], j);
for (k = 1; k <= 7; k++)
{
Assignment(a[2], k);
for (l = 1; l <= 7; l++)
{
Assignment(a[3], l);
for (m = 1; m <= 7; m++)
{
Assignment(a[4], m);
x = 0; y = 0;
//A,E周三必须上班;B,D,E周日必须休息
if (a[0][2] == 1 && a[4][2] == 1 && a[1][6] == 0 && a[3][6] == 0 && a[4][6] ==0)
for (n = 0; n < 7; n++)
{
//任何一天,必须保证ABCD中至少两人上班
if (a[0][n] + a[1][n] + a[2][n] + a[3][n] < 2)
break;
//一周中,至少有3天所有人都是上班的
if (a[0][n] == 1 && a[1][n] == 1 && a[2][n] == 1 && a[3][n] == 1 && a[4][n] == 1)
x++;
//A C一周中必须至少有四天能见面(同时上班)
if (a[0][n] == 1 && a[2][n] == 1)
y++;
}
if (x >= 3 && y >= 4)
{
for (q = 0; q < 5; q++)
{
for (n = 0; n < 7; n++)
printf("%d", a[q][n]);
putchar('\n');
}
putchar('\n');
}
}
}
}
}
}
return 0;
}