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

“蓝桥杯”决赛题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 在周日那天必须休息。