某保密单位机要人员 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

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

package com.liu.ex8;

import java.util.ArrayList;

public class Main {
public static int[] A = {1,1,1,1,1,1,1};
public static ArrayList<Integer> list = new ArrayList<Integer>();
public static ArrayList<String> planList = new ArrayList<String>(); public boolean check() {
int count1 = 0;
for(int i = 0;i < 10;i++) {
if(A[i % 7] == 1)
count1++;
else if(A[i % 7] == 0)
count1 = 0;
if(count1 >= 4)
return false;
}
return true;
} public void dfs(int step) {
while(step < 7) {
list.add(step);
if(list.size() == 2) {
A[list.get(0)] = 0;
A[list.get(1)] = 0;
if(check()) {
StringBuilder s = new StringBuilder("");
for(int i = 0;i < 7;i++)
s.append(A[i]);
planList.add(s.toString());
}
A[list.get(0)] = 1;
A[list.get(1)] = 1;
}
step++;
dfs(step);
list.remove(list.size() - 1);
}
} public void getValue(int[][] value, int[] A) {
for(int i = 0;i < A.length;i++) {
String temp = planList.get(A[i]);
for(int j = 0;j < temp.length();j++)
value[i][j] = temp.charAt(j) - '0';
}
} public boolean judge(int[][] value) {
//判断要求2
int count = 0;
for(int j = 0;j < value[0].length;j++) {
int sum = 0;
for(int i = 0;i < value.length;i++) {
if(value[i][j] == 1)
sum = sum + 1;
}
if(sum == value.length)
count++;
}
if(count < 3)
return false;
//判断要求3
for(int j = 0;j < value[0].length;j++) {
int sum = 0;
for(int i = 0;i < value.length - 1;i++) {
if(value[i][j] == 1)
sum = sum + 1;
}
if(sum < 2)
return false;
}
//判断要求4
if(value[1][6] != 0 || value[3][6] != 0 || value[4][6] != 0)
return false;
//判断要求5
if(value[0][2] != 1 || value[4][2] != 1)
return false;
//判断要求6
count = 0;
for(int j = 0;j < value[0].length;j++) {
if(value[0][j] == 1 && value[2][j] == 1)
count++;
}
if(count < 4)
return false;
return true;
} public void getResult() {
int len = planList.size();
int[][] value = new int[5][7];
int[] A = new int[5];
for(A[0] = 0;A[0] < len;A[0]++) {
for(A[1] = 0;A[1] < len;A[1]++) {
for(A[2] = 0;A[2] < len;A[2]++) {
for(A[3] = 0;A[3] < len;A[3]++) {
for(A[4] = 0;A[4] < len;A[4]++) {
getValue(value, A);
if(judge(value))
printResult(value);
}
}
}
}
}
return;
} public void printResult(int[][] value) {
for(int i = 0;i < value.length;i++) {
for(int j = 0;j < value[0].length;j++)
System.out.print(value[i][j]);
System.out.println();
}
System.out.println();
} public static void main(String[] args) {
Main test = new Main();
test.dfs(0); //获取满足题意要求1的一周工作日安排所有方案
test.getResult();
}
}

java实现人员排日程的更多相关文章

  1. java实现第三届蓝桥杯排日程

    排日程 [编程题](满分34分) 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天. 上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更. 此外,由于工作需要,还有如 ...

  2. Java开发人员最常犯的10个错误

    这个列表总结了10个Java开发人员最常犯的错误. Array转ArrayList 当需要把Array转成ArrayList的时候,开发人员经常这样做: List<String> list ...

  3. Java开发人员必须掌握的Linux命令(二)

    子曰:"工欲善其事,必先利其器." 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣)的表达来讲解让知识或者技术,让学习之旅充满乐趣,这就是写博文的初心. 本篇的旅 ...

  4. 【运维】Java开发人员掌握的Linux命令

    作为Java开发人员,要掌握常用的Linux命令. 为什么要写此文,笔者的Linux很厉害?NoNoNo,正因为笔者不熟悉Linux才写此文,以作整理. 最主要的命令 查询命令的简要用法,help 当 ...

  5. 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序

    面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 Ajax 为更好的 Web 应用程序铺平了道路 在 Web 应用程序开发中,页面重载循环是最大的一个使用障碍,对于 Java™ ...

  6. Java开发人员必须掌握的Linux命令-学以致用(5)

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  7. Java开发人员必须掌握的两个Linux魔法工具(四)

    子曰:"工欲善其事,必先利其器." 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣) ...

  8. Java开发人员必须掌握的Linux命令(三)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣)的表达来讲解知识或者技术,让学习之旅充满乐趣,这就是写博 ...

  9. Spring Boot 针对 Java 开发人员的安装指南

    Spring Boot 可以使用经典的开发工具或者使用安装的命令行工具.不管使用何种方式,你都需要确定你的 Java 版本为 Java SDK v1.8 或者更高的版本.在你开始安装之前,你需要确定你 ...

随机推荐

  1. IntelliJ Idea14 创建Maven多模块项目,多继承,热部署配置总结(三)

    pom.xml中repositories.pluginRepository的作用 pom.xml中repositories标签的作用是: 用来配置maven项目的远程仓库.示例如下: <repo ...

  2. vue 下拉刷新实现

    [手动实现下拉刷新]可以用vue-pull-refash 插件代替 //下拉刷新 let scroll = this.$ref.scroll // 获取当前要拖拽的元素 let top = scrol ...

  3. python 基础知识4 - 字典

    1.字典增 #字典增 dic = {'name': '大白', 'age': 20} dic['hight'] = 180 #没有键值对,添加 dic['age'] = 18 #有键值对,覆盖 pri ...

  4. 微信小程序通信录

    第一步:phone.wxml中 <view bindlongtap="clickPhone">{{phoneNum}}</view> 第二步:phone.j ...

  5. Nodejs模块介绍

    1.模块系统 require:引入模块,返回一个对象 module:指代当前的模块对象 module.exports:当前模块的导出对象 exports:指代module.exports __file ...

  6. 9.4 Go 数据格式

    9.4 Go 数据格式 1.1. msgpack格式 官方msgpack官网用一句话总结: It’s like JSON. but fast and small. 简单来讲,它的数据格式与json类似 ...

  7. mysql运维入门4:索引、慢查询、优化

    MySQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都是以B-树的形式保存 如果没有索引,执行查询时,MySQL必须从第一个记录开始整表扫描,知道查询到符合要求的记录,记录越大,花费时 ...

  8. 王艳 201771010127《面向对象程序设计(java)》第六周学习总结

    实验六 继承定义与使用 一:理论部分: 第五章:继承类. 1.继承:已有类来构建新类的一种机制.档定义了一个新类继承另一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的 ...

  9. 201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

    理论知识总结 第三章Java基本程序设计结构 1.基本知识:(1)标识符:是由字母.下划线.美元符号和数字组成,且第一个符号不能为数字.(2)关键字:剧啊语言中被赋予特定意义的一些单词.(3)注释 2 ...

  10. uniapp打包发版到linux服务器步骤----H5端

    最近在写uni-app项目,项目打包部署到服务器后,搞了好一会一直打开是空白页,原来自己有几个地方疏忽了,现把步骤整理一下: 第1步:编辑配置 mainifest.json 文件 tip:运行的基础路 ...