排日程

【编程题】(满分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或更高版本。

import java.util.ArrayList;

public class Main {
public static int[] S = {0, 1};
public static ArrayList<String> list = new ArrayList<String>();
public static ArrayList<String> result = new ArrayList<String>(); public boolean check(int[] A) {
int count = 0;
for(int i = 0;i < 7;i++) {
if(A[i] == 1)
count++;
if(A[i % 7] == 1 && A[(i+1) % 7] == 1 && A[(i+2) % 7] == 1
&& A[(i+3) % 7] == 1)
return false;
}
if(count == 5)
return true;
return false;
} public void dfs(int[] A, int step) {
if(step == A.length) {
if(check(A)) {
StringBuilder s = new StringBuilder("");
for(int i = 0;i < A.length;i++)
s.append(A[i]);
if(!list.contains(s))
list.add(s.toString());
}
return;
} else {
for(int i = 0;i < 2;i++) {
A[step] = S[i];
dfs(A, step + 1);
A[step] = -1;
}
}
} public boolean check1(String[] arrayA, int step) {
if(step >= 0) {
if(arrayA[0].charAt(2) != '1')
return false;
}
if(step >= 1) {
if(arrayA[1].charAt(6) != '0')
return false;
}
if(step >= 2) {
int count = 0;
for(int i = 0;i < arrayA[0].length();i++) {
if(arrayA[0].charAt(i) == arrayA[2].charAt(i) &&
arrayA[0].charAt(i) == '1')
count++;
}
if(count < 4)
return false;
}
if(step >= 3) {
if(arrayA[3].charAt(6) != '0')
return false;
for(int i = 0;i < arrayA[0].length();i++) {
int count = 0;
if(arrayA[0].charAt(i) == '1')
count++;
if(arrayA[1].charAt(i) == '1')
count++;
if(arrayA[2].charAt(i) == '1')
count++;
if(arrayA[3].charAt(i) == '1')
count++;
if(count < 2)
return false;
}
}
if(step >= 4) {
if(arrayA[4].charAt(6) != '0' || arrayA[4].charAt(2) != '1')
return false;
int count = 0;
for(int i = 0;i < arrayA[0].length();i++) {
if(arrayA[0].charAt(i) == '1' && arrayA[1].charAt(i)
== '1' && arrayA[2].charAt(i) == '1' &&
arrayA[3].charAt(i) == '1' && arrayA[4].charAt(i) == '1')
count++;
}
if(count < 3)
return false;
}
return true;
} public void dfsResult(String[] arrayA, int step) {
if(step == 5) {
String s = "";
for(int i = 0;i < arrayA.length;i++) {
s = s + arrayA[i] + "\n";
}
if(!result.contains(s))
result.add(s);
return;
} else {
for(int i = 0;i < list.size();i++) {
arrayA[step] = list.get(i);
if(check1(arrayA, step)) {
dfsResult(arrayA, step + 1);
arrayA[step] = "";
} else {
continue;
}
}
}
} public void getResult() {
int[] A = {-1,-1,-1,-1,-1,-1,-1};
dfs(A, 0);
String[] arrayA = new String[5];
dfsResult(arrayA, 0); for(int i = 0;i < result.size();i++)
System.out.println(result.get(i));
} public static void main(String[] args) {
Main test = new Main();
test.getResult(); }
}

java实现第三届蓝桥杯排日程的更多相关文章

  1. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...

  2. java实现第三届蓝桥杯方块填数

    方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部 ...

  3. java实现第三届蓝桥杯DNA对比

    DNA对比 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C. ...

  4. java实现第三届蓝桥杯火柴游戏

    火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...

  5. java实现第三届蓝桥杯源码变换

    源码变换 这道题因为有一些html语言在编写的时候不会显示出来,所以就用代码格式把题目写出来 [编程题](满分22分) 超文本标记语言(即HTML),是用于描述网页文档的一种标记语言. HTML通过文 ...

  6. java实现第三届蓝桥杯机器人行走

    机器人行走 [编程题](满分18分) 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). ...

  7. java实现第三届蓝桥杯地址格式转换

    地址格式转换 [编程题](满分21分) Excel是最常用的办公软件.每个单元格都有唯一的地址表示.比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5 ...

  8. java实现第三届蓝桥杯数据压缩

    数据压缩 某工业监控设备不断发回采样数据.每个数据是一个整数(0到1000之间).各个数据间用空白字符(空格,TAB或回车换行)分隔.这些数据以文本形式被存储在文件中. 因为大多数时候,相邻的采样间隔 ...

  9. java实现第三届蓝桥杯星期几

    星期几 1949年的国庆节(10月1日)是星期六. 今年(2012)的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢? 只要答案,不限手段! 可以用windows日历,windows ...

随机推荐

  1. Mybatis极速入门

    搭建mybatis的环境 导入相关jar包 mybatis-3.5.3.jar commons-logging-1.1.1.jar log4j-1.2.16.jar cglib-2.2.2.jar a ...

  2. Python --函数学习2

    一.函数参数和返回值 --参数:负责给函数传递一些必要的数据或者信息 -形参(形式参数):在函数定义的时候用到的参数,没有具体值,只是一个占位符号 -实参(实际参数):在调用函数的时候输入的值 exa ...

  3. SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)

    方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...

  4. 我,不是说了PID要平均值吗?

    前几日写了一篇PID算法学习笔记,并幻想了一个场景进行算法仿真.经过不断探索后,博主发现,PID算法的精髓不在算法逻辑,而在于PID三个参数的值.本篇随笔将延续上次的仿真实验进行调试,总结PID调参的 ...

  5. node的buffer模块

    Buffer这块很早前就想留一篇笔记.前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众. Buffer的含义是,在数据传输时用内存中的一 ...

  6. 模板渲染jnja2模块

    模板渲染jnja2模块 模板的引入: 在返回动态页面时,上述我们在08版web框架返回每次访问的时间,利用自己写的占位符进行字符串替换进行动态响应: 在实际应用中,完全可以从数据库中读取数据,然后替换 ...

  7. 谈谈C#中各种线程的使用及注意项~

    说到线程,很多人会想到timer吧, 接下来我们就来学习一下 timer 吧,摇摇脑袋,清醒一下,接下来开始学习.... 一.基本概念 1.什么是进程?        当一个程序开始运行时,它就是一个 ...

  8. hdu6092 01背包

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. PHP设计模式(一)

    1)工厂模式 工厂模式是用工厂方法生成对象,而不是直接new一个对象.假设我们在Config命名空间下有一个名叫Db的数据库操作类,用普通的方法,如果我们想去创建一个Db的对象,我们会直接new一个出 ...

  10. akka-typed(0) - typed-actor, typed messages

    akka 2.6.x正式发布以来已经有好一段时间了.核心变化是typed-actor的正式启用,当然persistence,cluster等模块也有较大变化.一开始从名称估摸就是把传统any类型的消息 ...