排日程

【编程题】(满分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. leeCode刷题 1078

    给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 firs ...

  2. 感觉shopex现在的升级方式太慢了

    我是说产品的更新,484,485是一个经典的版本,那时候免费,shopex 系统市场占用率很高.但是485以后呢,只有小版本的更新,fxw ,ekd 都是改进版本吧,没用特别大幅度的更新.5年前,10 ...

  3. 学习Echarts:(一)静态图表

    Echarts是现在比较火的js图表库,官网有丰富的实例和友好的入门教程.但是图表的种类很多,配置项的参数也很多,一开始我根据图表类型翻看配置项,发现这样学效率太低了,决定先制定一个简单的学习步骤,按 ...

  4. css概述四

    八.文本格式化 2.文本属性 ①文本颜色 color:合法的颜色值 ②文本对齐方式 text-align: 取值 left/center/right/justify 注意  1.一个元素写了text- ...

  5. nginx配置之虚拟主机功能

    虚拟主机功能: 一个nginx下运行多个网址(站点域名) 方式一:nginx.conf中的http{}中的每一个server{}就是一个站点(相同端口): #虚拟主机1 server { listen ...

  6. ABAP基础4:模块化

    子程序定义 以form开始,以endform结束,用perform语句调用,from语句可以在程序内部/外部,perform一定要写在前面 perform. from. 子程序模块 endform. ...

  7. GreenPlum-数据存储目录迁移及常用操作

    一.环境介绍 Greenplum5 3节点集群,Centos7.2虚拟机, 二.需求 因为/home目录磁盘空间已满,需要将Greenplum的数据存储目录转移到新的分区/opt目录下,虚拟机磁盘管理 ...

  8. 实验三 Java基本程序设计(2)

                                             实验三 Java基本程序设计(2)                                           ...

  9. Fabric进阶(二)—— 在已有组织中增加节点

    fabric网络在创建时就已经确定了初始的节点数量,而在实际应用场景中可能会需要在某个组织中动态增加节点.这里以balance-transfer v1.0为例(2 Org,4 Peer),介绍如何在o ...

  10. PAT-1134 Vertex Cover (图的建立 + set容器)

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...