日期:2014-05-20  浏览次数:20611 次

“蓝桥杯”决赛题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++ )