• java实现日程表


    【编程题】

    某保密单位机要人员 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);
    	}
    }
    
  • 相关阅读:
    实现货币金额中文大写转换的程序
    大数阶乘的计算(三)
    全国15亿人口中选1000个代表有多少种选法?
    DB Query Analyzer 中断SQL语句的执行
    Android_Preference存取数据
    Centos 学习笔记软件包管理
    Centos学习笔记文件搜索命令
    《计算机时代》2011年第12期刊登出《DB Query Analyzer中断SQL语句的执行》
    Centos学习笔记linux用户管理
    Centos学习笔记 linux 常用命令:压缩解压命令
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947231.html
Copyright © 2020-2023  润新知