【编程题】

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