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

【注意】

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

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

  1. package com.liu.ex8;
  2. import java.util.ArrayList;
  3. public class Main {
  4. public static int[] A = {1,1,1,1,1,1,1};
  5. public static ArrayList<Integer> list = new ArrayList<Integer>();
  6. public static ArrayList<String> planList = new ArrayList<String>();
  7. public boolean check() {
  8. int count1 = 0;
  9. for(int i = 0;i < 10;i++) {
  10. if(A[i % 7] == 1)
  11. count1++;
  12. else if(A[i % 7] == 0)
  13. count1 = 0;
  14. if(count1 >= 4)
  15. return false;
  16. }
  17. return true;
  18. }
  19. public void dfs(int step) {
  20. while(step < 7) {
  21. list.add(step);
  22. if(list.size() == 2) {
  23. A[list.get(0)] = 0;
  24. A[list.get(1)] = 0;
  25. if(check()) {
  26. StringBuilder s = new StringBuilder("");
  27. for(int i = 0;i < 7;i++)
  28. s.append(A[i]);
  29. planList.add(s.toString());
  30. }
  31. A[list.get(0)] = 1;
  32. A[list.get(1)] = 1;
  33. }
  34. step++;
  35. dfs(step);
  36. list.remove(list.size() - 1);
  37. }
  38. }
  39. public void getValue(int[][] value, int[] A) {
  40. for(int i = 0;i < A.length;i++) {
  41. String temp = planList.get(A[i]);
  42. for(int j = 0;j < temp.length();j++)
  43. value[i][j] = temp.charAt(j) - '0';
  44. }
  45. }
  46. public boolean judge(int[][] value) {
  47. //判断要求2
  48. int count = 0;
  49. for(int j = 0;j < value[0].length;j++) {
  50. int sum = 0;
  51. for(int i = 0;i < value.length;i++) {
  52. if(value[i][j] == 1)
  53. sum = sum + 1;
  54. }
  55. if(sum == value.length)
  56. count++;
  57. }
  58. if(count < 3)
  59. return false;
  60. //判断要求3
  61. for(int j = 0;j < value[0].length;j++) {
  62. int sum = 0;
  63. for(int i = 0;i < value.length - 1;i++) {
  64. if(value[i][j] == 1)
  65. sum = sum + 1;
  66. }
  67. if(sum < 2)
  68. return false;
  69. }
  70. //判断要求4
  71. if(value[1][6] != 0 || value[3][6] != 0 || value[4][6] != 0)
  72. return false;
  73. //判断要求5
  74. if(value[0][2] != 1 || value[4][2] != 1)
  75. return false;
  76. //判断要求6
  77. count = 0;
  78. for(int j = 0;j < value[0].length;j++) {
  79. if(value[0][j] == 1 && value[2][j] == 1)
  80. count++;
  81. }
  82. if(count < 4)
  83. return false;
  84. return true;
  85. }
  86. public void getResult() {
  87. int len = planList.size();
  88. int[][] value = new int[5][7];
  89. int[] A = new int[5];
  90. for(A[0] = 0;A[0] < len;A[0]++) {
  91. for(A[1] = 0;A[1] < len;A[1]++) {
  92. for(A[2] = 0;A[2] < len;A[2]++) {
  93. for(A[3] = 0;A[3] < len;A[3]++) {
  94. for(A[4] = 0;A[4] < len;A[4]++) {
  95. getValue(value, A);
  96. if(judge(value))
  97. printResult(value);
  98. }
  99. }
  100. }
  101. }
  102. }
  103. return;
  104. }
  105. public void printResult(int[][] value) {
  106. for(int i = 0;i < value.length;i++) {
  107. for(int j = 0;j < value[0].length;j++)
  108. System.out.print(value[i][j]);
  109. System.out.println();
  110. }
  111. System.out.println();
  112. }
  113. public static void main(String[] args) {
  114. Main test = new Main();
  115. test.dfs(0); //获取满足题意要求1的一周工作日安排所有方案
  116. test.getResult();
  117. }
  118. }

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. 如何使用 frp 实现内网穿透

    这有一个专注Gopher技术成长的开源项目「go home」 背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了. ...

  2. IDEA快捷键(windows)

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  3. XLNet看这篇文章就足以!

    文章链接:https://arxiv.org/pdf/1906.08237.pdf 代码链接:英文--https://github.com/zihangdai/xlnet      中文--https ...

  4. ESXI 6.5利用Centos7重置root密码

    ESXI6.5宿主机,很久没有登录,再次登录的时候,发现忘记root密码了 1.先将刻录一个CentOS7的启动光盘或U盘,并将服务器的启动项修改为光盘 2.保存BIOS重启后,选择Troublesh ...

  5. 论文阅读:Reducing Transformer Depth On Demand With Structured Dropout

    Introduction 这篇paper是做Transformer压缩的,但其实bert的核心也就是transformer,这篇paper的实验里也做了bert的压缩.作者的主要工作是提出了Layer ...

  6. 【1-n】区间覆盖 TOJ4168+BZOJ1192

    Xiao Ming is very interesting for array. He given a sorted positive integer array and an integer n. ...

  7. elasticsearch7.X x-pack破解

    简介: x-pack是elasticsearch的一个收费的扩展包,将权限管理,警告,监视等功能捆绑在一个易于安装的软件包中,x-pack被设计为一个无缝的工作,但是你可以轻松的启用或者关闭一些功能. ...

  8. iOS开发判断手机号及其运营商

    根据三大运营商出现的号段(号段来自百度百科) 判断是否是手机号 + (BOOL)isMobile:(NSString *)str { NSString *MOBILE = @"^1(3[0- ...

  9. 【HTTP】Web及网络基础&HTTP基础

    HTTP协议访问Web 一.大体访问过程 1. 浏览器地址栏输入URL 2. 浏览器从服务端获取文件资源 3. 浏览器显示Web页面 二.HTTP的版本历史 1. HTTP/0.9 没有作为正式的标准 ...

  10. 8分钟为你详解React、Angular、Vue三大前端技术

    [引言] 当前世界中,技术发展非常迅速并且变化迅速,开发者需要更多的开发工具来解决不同的问题.本文就对于当下主流的前端开发技术React.Vue.Angular这三个框架做个相对详尽的探究,目的是为了 ...