【编程题】

某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息两天。

上级要求每个人每周的工作日和休息日必须是固定的,不能在周间变更。

此外,由于工作需要,还有如下要求:

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


public class RiCheng
{
static int N = 0; public static void show(int[][] a)
{
for(int i=0; i<5; i++)
{
for(int j=0; j<7; j++)
{
System.out.print(a[i][j]);
}
System.out.println();
}
} public static void ping_jia(int[][] a)
{
// 连续工作不多于3天
for(int i=0; i<5; i++)
{
int sum = 0;
for(int j=0; j<14; j++)
{
if(a[i][j%7]==0)
sum = 0;
else
{
sum++;
if(sum>3) return;
}
}
} // 至少有3天所有人都上班
int k = 0;
for(int i=0; i<7; i++)
{
if(a[0][i]==0 || a[1][i]==0 || a[2][i]==0 || a[3][i]==0 || a[4][i]==0) k++;
}
if(k==7||k==6||k==5) return; // A B C D 中保证有2人上班
for(int i=0; i<7; i++)
{
int m = 0;
if(a[0][i]==1) m++;
if(a[1][i]==1) m++;
if(a[2][i]==1) m++;
if(a[3][i]==1) m++;
if(m<2) return;
} // B D E 周日必须休息
if(a[1][6]==1 || a[3][6]==1 || a[4][6]==1) return; // A E 周三必须上班
if(a[0][2]==0 || a[4][2]==0) return; // A 与 C 一周中必须至少有4天能见面
k=0;
for(int i=0; i<7; i++)
{
if(a[0][i]==1 && a[2][i]==1) k++;
}
if(k<4) return; N++; show(a);
System.out.println("");
} public static void f(int[][] a, int row)
{
if(row==5)
{
ping_jia(a);
return;
} for(int i=0; i<7; i++)
{
for(int j=i+1; j<7; j++)
{
for(int k=0; k<7; k++) a[row][k] = 1;
a[row][i] = 0;
a[row][j] = 0; f(a, row+1);
}
}
} public static void main(String[] args)
{
int[][] a = {{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},
{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},}; f(a,0); System.out.println("N=" + N);
}
}

最新文章

  1. 每天一个linux命令(26):用SecureCRT来上传和下载文件
  2. java中使用junit测试
  3. Daily Scrum 10.24
  4. easyui 之ComboTree 用法Demo
  5. Java安装程序制作
  6. git bash中带空格的文件夹以及文件的处理
  7. Winform- TreeView的使用例子
  8. jQuery常用方法集锦
  9. Java Spring的简单见解
  10. Hyperledger Fabric 1.0 从零开始(二)——环境构建(公网)
  11. ActiveMQ 入门helloworld
  12. ndarray数据类型
  13. Exp3 免杀原理与实践
  14. Freemarker list 的简单使用
  15. Linux CentOS 下关闭防火墙
  16. linux下rsync+inotify实现服务器之间文件实时同步
  17. 如何在 Windows 10 中搭建 Node.js 环境?
  18. 51nod 1636 教育改革
  19. ArrayBlockingQueue 阻塞队列和 Semaphore 信号灯的应用
  20. 第十课 C++异常简介

热门文章

  1. 智能制造:数字化协同技术在BIW焊装产线的应用
  2. 最短Hamilton路径 数位dp
  3. AIX 解除镜像再重建同步
  4. mysql小白系列_02 mysql源码安装标准化
  5. Oracle分页查询语句的写法
  6. 安卓网络编程学习(1)——java原生网络编程(2)
  7. Maven、Gradle 配置国内镜像源
  8. Java并发编程volatile关键字
  9. Redis-Redis基本类型及使用Java操作
  10. Codeblocks运行按钮变灰,卡程序编译