蓝桥系列(二)人员排日程

问题描述:





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




【注意】


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    
    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。


思路:用回溯法解决。数的深度为35,,解空间数为二叉树,1-7层表示A周一至周日的上班情况,8-14表示B周一至周日的上班情况,由此类推。


代码:

package lanqiao;


import java.util.ArrayList;
import java.util.List;


public class PaiRiCheng {


/**
* @param args
*/
public static void main(String[] args) {
new PaiRiCheng().print();
}
public void print(){
back(0);
for(int i=0;i<solutions.size();++i){
int []solution=solutions.get(i);
for(int j=0;j<solution.length;++j){
System.out.print(solution[j]);
if((j+1)%7==0){
System.out.println();
}
}
System.out.println();
}
}
//保存从根节点到当前结点的路径
//paht[0]至path[6]表示A的上班情况,path[7]至path[13]表示B的上班情况,由此类推。
private int[] path = new int[35];


//保存所有的解
private List<int[]> solutions = new ArrayList<int[]>();


public void back(int n) {
if (n < 35) {
for (int i = 0; i < 2; ++i) {
path[n] = i;
if (constraint(n)) {
if (n == 34) {
if (isTarget()) {
solutions.add(clonePath());
}
} else {
back(n + 1);
}
}


}
}
}


public int[] clonePath() {
int[] solution = new int[35];
for (int i = 0; i < solution.length; ++i) {
solution[i] = path[i];
}
return solution;
}


public boolean isTarget() {
//一周中,至少有3天所有人都是上班的
int total=0;
for(int i=0;i<7;++i){
int shangBanRenShu=0;
for(int j=0;j<5;++j){
if(path[i+7*j]==1){
shangBanRenShu++;
}
}
if(shangBanRenShu==5){
total++;
}
}
if(total<3){
return false;
}
return true;
}


public boolean constraint(int n) {
//每周需要工作五天
if((n+1)%7==0){
int total=0;
for(int i=n-6;i<n+1;++i){
if(path[i]==1){
total++;
}
}
if(total!=5){
return false;
}
}
//所有人的连续工作日不能多于3天
if((n+1)%7==0){
for(int i=n-6;i<n+1;++i){
int total=0;
for(int j=i;j<i+4;++j){
int k=j;
if(j>=n+1){
k=j-7;
}
if(path[k]==1){
total++;
}
}
if(total>=4){
return false;
}
}
}
//任何一天,必须保证ABCD中至少有两人上班
if(n==27){
for(int i=0;i<7;++i){
int total=0;
for(int j=0;j<4;++j){
if(path[i+j*7]==1){
total++;
}
}
if(total<2){
return false;
}
}
}
// BDE在周日那天必须休息
if ((n == 13 || n == 27 || n == 34) && path[n] == 1) {
return false;
}
//AE周三必须上班
if((n==2||n==30)&&path[n]==0){
return false;
}
//AC一周中至少四天同时上班
if(n==20){
int total=0;
for(int i=0;i<7;++i){
if(path[i]==1&&path[14+i]==1){
total++;
}
}
if(total<4){
return false;
}
}
return true;
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值