首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

“蓝桥杯”决赛题5,该如何解决

2013-10-21 
“蓝桥杯”决赛题5【编程题】(满分34分)某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。上级要求每个

“蓝桥杯”决赛题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 在周日那天必须休息。
 int b[] = {i,j,k,x,y};
 if (!checkOK(b))  continue;//一周中,至少有3天所有人都是上班的。
 for(int m:b){
 for(int d:s[m]){
 System.out.print(d); 
 }
 System.out.println();
 } 
 System.out.println();
 
 }
 }
  }
}
}

public static void main(String[] args) {

getCount();
getAnswer();
}

}

输出结果:
1011101
1110110
1011101
1110110
1110110

1011011
1110110
1011011
1110110
1110110

0111011
1110110
0111011
1110110
1110110

0110111
1101110
0110111
1101110
1110110
[解决办法]
上面这个函数写错了
public static boolean checkOK(int b[]){
int i,j,count = 0;
for (i = 0;i<7 ;i++ )//一周中,至少有3天所有人都是上班的。
{
  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++){//A C 一周中必须至少有4天能见面(即同时上班)。
if (s[b[0]][i] +s[b[2]][i] == 2) count ++;
}
if (count < 4) return false;
for (i = 0;i<7 ;i++ )//任何一天,必须保证 A B C D 中至少有2人上班。
{
  int temp = 0;
  for (j = 0 ;j<4;j++){//这里应该是4
 temp +=s[b[j]][i];
  }
  if (temp < 2 ) return false;
}

return true;

}
------解决方案--------------------


引用:
输出结果:
1011101
1110110
1011101
1110110
1110110

1011011
1110110
1011011
1110110
1110110

0111011
1110110
0111011
1110110
1110110

0110111
1101110
0110111
1101110
1110110

我的解和你的一样。

热点排行