// 某保密单位机要人员 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
// 用C语言编写
#include "stdlib.h"
int getOnes( int val )
{
int counts = 0;
int i = 0;
for( i = 0 ; i < 8*sizeof(val) ; i++ ){
counts += ((1<<i)&val)>0?1:0;
}
return counts;
}
void printSchedule( char* info, int schedule, int size )
{
int i;
printf("%s: %02X (", info,schedule );
for(i = size*8-1; i >= 0 ; --i){
printf("%d", ((1<<i)&schedule)>0?1:0 );
}
printf(")\n");
}
void printResult( unsigned char schedule )
{
int i;
for(i = 6; i >= 0 ; --i){
printf("%d", ((1<<i)&schedule)>0?1:0 );
}
printf("\n");
}
int main(int argc, char const *argv[])
{
// result
int schedule_a = 0;
int schedule_b = 0;
int schedule_c = 0;
int schedule_d = 0;
int schedule_e = 0;
// possible schedules
unsigned char pos_schedules[0xFF] = {0};
int pos_schedules_count = 0;
int free_day_one = 0;
int free_day_two = 0;
unsigned char schedule;
// rule 1
unsigned short rule_1 = 0x000F;
unsigned short rule_1_checker = 0;
unsigned short rule_1_result = 0;
// rule 2
unsigned char rule_2 = 0;
// rule 3
unsigned char rule_3 = 0;
unsigned char rule_3_result = 0;
// rule 4
unsigned char rule_4 = 0;
// rule 5
unsigned char rule_5 = 0;
// rule 5
unsigned char rule_6 = 0;
// helpers
int i;
int total_schedules = 0;
// search for the possible schedules
for(free_day_one = 0; free_day_one < 7; ++free_day_one){
for(free_day_two = free_day_one; free_day_two < 7; ++free_day_two){
// rule 0, 每周需要工作5天,休息2天
if( free_day_one != free_day_two ){
// get a schedule
schedule = (~(1<<free_day_one)) & (~(1<<free_day_two)) & 0x7F;
// rule 1, 所有人的连续工作日不能多于3天
// (注意:周日连到下周一也是连续)
// expand schedule 7 days (8 bits) to 14 days ( 16 bits )
rule_1_checker = schedule;
rule_1_checker <<= 7;
rule_1_checker |= schedule;
rule_1 = 0x000F;
rule_1_result = 1;
for(i = 0; i < 14-3; ++i){
rule_1_result = rule_1_result
&& ((rule_1_checker&rule_1)!=rule_1);
rule_1 <<= 1;
}
if( rule_1_result ){
pos_schedules[pos_schedules_count++] = schedule;
// printSchedule("schedule",schedule,sizeof(schedule) );
// printf("day1:%d day2:%d\n", free_day_one,free_day_two);
}
}
}
}
// get candler
for (schedule_a = 0; schedule_a < pos_schedules_count; ++schedule_a){
for (schedule_b = 0; schedule_b < pos_schedules_count; ++schedule_b){
for (schedule_c = 0; schedule_c < pos_schedules_count; ++schedule_c){
for (schedule_d = 0; schedule_d < pos_schedules_count; ++schedule_d){
for (schedule_e = 0; schedule_e < pos_schedules_count; ++schedule_e){
// rule 2, 一周中,至少有3天所有人都是上班的。
rule_2 = pos_schedules[schedule_a] &
pos_schedules[schedule_b] &
pos_schedules[schedule_c] &
pos_schedules[schedule_d] &
pos_schedules[schedule_e] ;
if( getOnes(rule_2) < 3 ){
continue;
}
// rule 3, 任何一天,必须保证 A B C D 中至少有2人上班。
rule_3_result = 1;
for (i = 0; i < 7; ++i){
rule_3 = (pos_schedules[schedule_a]&(1<<i))>0?1:0;
rule_3 <<= 1;
rule_3 |= (pos_schedules[schedule_b]&(1<<i))>0?1:0;
rule_3 <<= 1;
rule_3 |= (pos_schedules[schedule_c]&(1<<i))>0?1:0;
rule_3 <<= 1;
rule_3 |= (pos_schedules[schedule_d]&(1<<i))>0?1:0;
rule_3_result = rule_3_result && (getOnes(rule_3)>=2);
}
if( ! rule_3_result ){
continue;
}
// rule 4, B D E 在周日那天必须休息。
rule_4 = 1;
rule_4 = rule_4 && ((pos_schedules[schedule_b]&0x01)==0);
rule_4 = rule_4 && ((pos_schedules[schedule_d]&0x01)==0);
rule_4 = rule_4 && ((pos_schedules[schedule_e]&0x01)==0);
if ( ! rule_4 ){
continue;
}
// rule 5, A E 周三必须上班。
rule_5 = 1;
rule_5 = rule_5 && ((pos_schedules[schedule_a]&0x10)>0);
rule_5 = rule_5 && ((pos_schedules[schedule_e]&0x10)>0);
if ( ! rule_5 ){
continue;
}
// rule 6, A C 一周中必须至少有4天能见面(即同时上班)。
rule_6 = pos_schedules[schedule_a] & pos_schedules[schedule_c];
if( getOnes(rule_6) < 4 ){
continue;
}
// passed all rules
// printf("result\n");
// printSchedule("schedule_a",pos_schedules[schedule_a],
// sizeof(pos_schedules[schedule_a]) );
// printSchedule("schedule_b",pos_schedules[schedule_b],
// sizeof(pos_schedules[schedule_b]) );
// printSchedule("schedule_c",pos_schedules[schedule_c],
// sizeof(pos_schedules[schedule_c]) );
// printSchedule("schedule_d",pos_schedules[schedule_d],
// sizeof(pos_schedules[schedule_d]) );
// printSchedule("schedule_e",pos_schedules[schedule_e],
// sizeof(pos_schedules[schedule_e]) );
printResult(pos_schedules[schedule_a]);
printResult(pos_schedules[schedule_b]);
printResult(pos_schedules[schedule_c]);
printResult(pos_schedules[schedule_d]);
printResult(pos_schedules[schedule_e]);
printf("\n");
total_schedules++;
} } } } }
// printf("total counts %d\n", total_schedules);
return 0;
}
温馨提示:内容为网友见解,仅供参考
排日程问题,某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天...
\/\/ 2. 一周中,至少有3天所有人都是上班的。\/\/ 3. 任何一天,必须保证 A B C D 中至少有2人上班。\/\/ 4. B D E 在周日那天必须休息。\/\/ 5. A E 周三必须上班。\/\/ 6. A C 一周中必须至少有4天能见面(即同时上班)。\/\/\/ 你的任务是:\/\/ 编写程序,列出ABCDE所有可能的一周排...
排日程问题 c语言
很明显,e的排班只能是1,1,1,0,1,1,0!对于A,星期三是1,然后剩余的6天再选4个工作日,即C(6,4)!同理,B是C(6,5),C是C(7,5),D是C(6,5)!大概枚举情况:全部相乘起来:90*21*6这么多次就够了!
如何做好机要工作求解
保密工作涉及面广,做好机要保密工作,首先,各级领导要高度重视,把机要保密工作列入各级行的重要议事日程,定期分析保密工作形势、管理现状和队伍建设情况,及时研究解决保密工作中的重点难点问题。其次,机要保密工作单靠一两个保密干部是无法搞好的,必须建立完善的机要保密工作管理体制及组织机构,形成保密队伍和网络,这是我们...
保密工作总结
同时文件管理人员不固定,文件管理常常出现脱节现象,对机要文件的保密安全构成严重威胁。对此,在全省机要文件保密安全检查时,省委办公厅、市委办公室都提出了批评,并把我县列为全省重点整改单位。这种局面引起了县委领导的高度重视,县委常委、县委办公室主任王中义同志立即把机要文件管理工作列入重要工作日程,在县委常委会上作...
保密工作中存在的问题整改自查报告
【篇一】保密工作中存在的问题整改自查报告 我公司坚持以“三个代表”重要思想和科学发展观为指导,深入贯彻上级关于做好保密工作的要求,认真执行《保密法》及其实施细则的有关条款,加强对保密工作的领导,严抓各项制度建设和落实,开展了多种形式的保密宣传教育,使我公司保密队伍的政治素质和业务素质明显提高,全公司没...
单位保密工作总结
篇一:单位保密工作总结 我局保密工作在市委市政府的领导下,按照市保密局的部署,积极开展保密宣传教育,重点抓好各项保密自查,进一步完善保密制度,较好地完成了年度工作任务。 一、20xx年保密工作总结 (一)加强组织领导建设。我局领导高度重视保密工作,要求局里在安排每周的政治学习会议时,必须增加保密知识学习的内容,...
职业卫生档案与职业健康监护档案管理制度
1、 配备具有较好政治业务素质的专(兼)职档案人员,并保持相对稳定。 2、 将档案工作纳入本单位的议事日程(每半年研究一次档案工作),帮助专(兼)职档案人员解决工作中的实际困难。 3、 组织本单位人员学习档案法规,执行局档案工作的规章制度。 4、 疏通渠道,严格制度,督促有关人员注意平时各类文件材料的形成积累,积...
保密工作自查自评报告存在问题7篇
密码设备由专业技术公司专业人员现场维修,委局密码设备管理人员全程监控,废弃的密码设备存储介质交由保密单位统一处理。 四是抓好密钥管理。委局涉及密钥设备一套,密码机、交换机均由中纪委信息中心统一配装。密钥由办公室主任掌握管理,设备安装在保密专用机房。涉及密钥设备的使用由委局普通密码安全保密的工作领导小组组长...
文员的工作
办公室文员工作职责 主要负责会议、文书、印信、档案、接待、宣传栏、文件报纸收发,具体是: 1. 接听、转接电话;接待来访人员。 2. 负责办公室的文秘、信息、机要和保密工作,做好办公室档案收集、整理工作。 3. 负责总经理办公室的清洁卫生。 4. 做好会议纪要。 5. 负责公司公文、信件、邮件、报刊杂志的分送。
部门保密自查报告范文精选5篇
1。始终把-列入议事日程。领导班子将保密-一项重要工作来抓,成立保密-小组,督促各项 措施 的落实。我分局还把保密-每年的机关公务员年度考核和领导班子民主生活会,形成了严密的保密-。 2。抓好全体干部职工的保密宣传教育。为了搞好分局的保密教育工作,领导班子成员带头学习保密知识、带头遵守保密制度,并组织分局全体干部...