“蓝桥杯”决赛题5
【编程题】(满分34分)
某保密单位机要人员 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
【注意】
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
请不要使用package语句。
源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。
------解决方案--------------------专科Java的题?
------解决方案--------------------蓝桥不太考察程序性能,此题暴力枚举,对每个case逐规则检查是否满足条件,可以解。
------解决方案--------------------有一种说法是把所有的情况列举出来,然后一个一个筛查
------解决方案--------------------排课算法的压缩版?
------解决方案--------------------我靠 想起了公务员行政测试
------解决方案--------------------
来了一个暴力搜索的,不知道对不对!
public class test5 {
public static int[][] s = new int[100][7];
public static int Count = 0;
public static boolean isOK(int a[]){
int i ,sum = 0;
for (i= 0;i<10;i++){
sum += a[i%7];
if (sum > 3) return false;
if (a[i%7] == 0) sum = 0;
}
return true;
}
public static void getCount()
{
int i,j,k,x,y;
for(i=1;i<=7;i++)
for(j=i+1;j<=7;j++)
for(k=j+1;k<=7;k++)
for(x=k+1;x<=7;x++)
for(y=x+1;y<=7;y++){
int a[]={0,0,0,0,0,0,0};
a[i-1] =1;
a[j-1] =1;
a[k-1] =1;
a[x-1] =1;
a[y-1] =1;
if (isOK(a)){
for (int n= 0 ;n<7;n++){
s[Count][n] = a[n];
}
Count ++;
}
}
}
public static boolean checkOK(int b[]){
int i,j,count = 0;
for (i = 0;i<7 ;i++ )
{
int temp = 0;
for (j = 0 ;j<5;j++){
temp +=s[b[j]][i];
}
if (temp == 5 ) count++;
}
if (count < 3) return false;
count = 0;
for (i = 0;i< 7;i++){
if (s[b[0]][i] +s[b[2]][i] == 2) count ++;
}
if (count <4) return false;
for (i = 0;i<7 ;i++ )
{
int temp = 0;
for (j = 0 ;j<5;j++){
temp +=s[b[j]][i];
}
if (temp < 2 ) return false;
}
return true;
}
public static void getAnswer(){
int i,j,k,x,y;
for(i=0;i< Count;i++)//A
{
if (s[i][2] != 1) continue; //A E 周三必须上班。
for(j=0;j< Count;j++)//B
{
if (s[j][6] != 0) continue;//B D E 在周日那天必须休息。
for(k=0;k< Count;k++)//C
for(x=0;x< Count;x++)//D
{
if (s[x][6] != 0) continue;//B D E 在周日那天必须休息。
for(y=0;y< Count;y++)
{
if (s[y][2] != 1) continue;//A E 周三必须上班。
if (s[y][6] != 0) continue;//B D E 在周日那天必须休息。