zoukankan      html  css  js  c++  java
  • 蓝桥杯-排日程

    【编程题】(满分32分)


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


    java代码如下:

    //排日程
    public class js_cgz_05 {
    	private static int[][] types;
    	public static void main(String[] args) {
    		//根据条件:
    		//1.必须工作5天,休息2天
    		//2.不能连续工作超过3天
    		//根据以上两个条件可以确定每个人的时间安排只可能有7种可能
    		//即以下这七种情况:(0表示休息,1表示上班)
    //		0 1 1 1 0 1 1 
    //		1 0 1 1 1 0 1 
    //		1 1 0 1 1 1 0 
    //		0 1 1 0 1 1 1 
    //		1 0 1 1 0 1 1 
    //		1 1 0 1 1 0 1 
    //		1 1 1 0 1 1 0
    		types=new int[7][7]; 
    		int j=0;
    		//初始化types数组,i表示第一个0出现的下标,j表示第二个0出现的下标
    		for(int i=0;i<7;i++){
    			j=(i+4)%7;
    			for(int t=0;t<7;t++){
    				if(t==i||t==j){
    					types[i][t]=0;
    				}else{
    					types[i][t]=1;
    				}
    			}
    		}
    		//types初始化结束
    		
    		//测试所有情况,每个人都可以从7种可能的工作情况中选一种,所以一共有5^7种可能
    		for(int a=0;a<7;a++){//a=i表示A采用第i种工作情况
    			// A周三必须上班
    			if(types[a][2]==0)continue;
    			for(int b=0;b<7;b++){
    				// B在周日那天必须休息
    				if(types[b][6]==1)continue;
    				for(int c=0;c<7;c++){
    					// A C 一周中必须至少有4天能见面(即同时上班)
    					if(!validateAC(a, c))continue;
    					for(int d=0;d<7;d++){
    						//D在周日那天必须休息
    						if(types[d][6]==1)continue;
    					    //任何一天,必须保证ABCD中至少有2人上班
    						if(!validateABCD(a, b, c, d))continue;
    						for(int e=0;e<7;e++){
    							//E 周三必须上班,周日那天必须休息
    							if(types[e][2]==0||types[e][6]==1)continue;
    							// 一周中,至少有3天所有人都是上班的
    							if(!validateAll(a, b, c, d, e))continue;
    							print(a, b, c, d, e);
    						}
    					}
    				}
    			}
    		}
    	}
    	//判断ABCD每天是否至少有2人上班,是返回true,否返回false
    	public static boolean validateABCD(int a,int b,int c,int d){
    		for(int i=0;i<7;i++){
    			if(types[a][i]+types[b][i]+types[c][i]+types[d][i]<2)return false;
    		}
    		return true;
    	}
    	//判断一周中是否至少有3天所有人都是上班的
    	public static boolean validateAll(int a,int b,int c,int d,int e){
    		int days=0;
    		for(int i=0;i<7;i++){
    			if(types[a][i]+types[b][i]+types[c][i]+types[d][i]+types[e][i]==5)days++;
    		}
    		return days>=3;
    	}
    	//判断一周中是否A,C至少有4天能见面
    	public static boolean validateAC(int a,int c){
    		int days=0;
    		for(int i=0;i<7;i++){
    			if(types[a][i]+types[c][i]==2)days++;
    		}
    		return days>=4;
    	}
    	//打印结果
    	public static void print(int a,int b,int c,int d,int e){
    		for(int i=0;i<7;i++)System.out.print(types[a][i]);
    		System.out.println();
    		for(int i=0;i<7;i++)System.out.print(types[b][i]);
    		System.out.println();
    		for(int i=0;i<7;i++)System.out.print(types[c][i]);
    		System.out.println();
    		for(int i=0;i<7;i++)System.out.print(types[d][i]);
    		System.out.println();
    		for(int i=0;i<7;i++)System.out.print(types[e][i]);
    		System.out.println();
    		
    		System.out.println();
    	}
    }


    输出:

    0111011
    1110110
    0111011
    1110110
    1110110
    
    1011101
    1110110
    1011101
    1110110
    1110110
    
    0110111
    1101110
    0110111
    1101110
    1110110
    
    1011011
    1110110
    1011011
    1110110
    1110110


  • 相关阅读:
    poj 1013 Counterfeit Dollar
    poj百练2973:Skew数 进制问题
    poj百练2972 进制问题
    poj2080 Calendar
    POJ 1928 The Peanuts
    EXCEL打开CSV文件乱码的解决方法
    希望博客园做个软件职业生存状态调查问卷
    Linq使用Group By [转]
    ADO.NET 从DataTable中获取某列含有的不同值的几种方式
    本该遭拒的十大科技专利:苹果滑动解锁上榜[转]
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3165501.html
Copyright © 2011-2022 走看看