C语言 蓝桥杯决赛排日程

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



#include <stdio.h>

//每人工作安排只有七种情况
void Assignment(int *a, int i)
{
	switch (i)
	{
	case 1:
		a[0] = 0; a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 1; a[5] = 1; a[6] = 1;
		break;
	case 2:
		a[0] = 0; a[1] = 1; a[2] = 1; a[3] = 1; a[4] = 0; a[5] = 1; a[6] = 1;
		break;
	case 3:
		a[0] = 1; a[1] = 1; a[2] = 0; a[3] = 1; a[4] = 1; a[5] = 1; a[6] = 0;
		break;
	case 4:
		a[0] = 1; a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 1; a[5] = 1; a[6] = 0;
		break;
	case 5:
		a[0] = 1; a[1] = 0; a[2] = 1; a[3] = 1; a[4] = 1; a[5] = 0; a[6] = 1;
		break;
	case 6:
		a[0] = 1; a[1] = 0; a[2] = 1; a[3] = 1; a[4] = 0; a[5] = 1; a[6] = 1;
		break;
	case 7:
		a[0] = 1; a[1] = 1; a[2] = 0; a[3] = 1; a[4] = 1; a[5] = 0; a[6] = 1;
		break;
	}
}


int main()
{
	int a[5][7], i, j, k, l, m, x, y, n, q;
	for (i = 1; i <= 7; i++)
	{
		Assignment(a[0], i);
		for (j = 1; j <= 7; j++)
		{
			Assignment(a[1], j);
			for (k = 1; k <= 7; k++)
			{
				Assignment(a[2], k);
				for (l = 1; l <= 7; l++)
				{
					Assignment(a[3], l);
					for (m = 1; m <= 7; m++)
					{
						Assignment(a[4], m);
						x = 0;  y = 0;
						//A,E周三必须上班;B,D,E周日必须休息
						if (a[0][2] == 1 && a[4][2] == 1 && a[1][6] == 0 && a[3][6] == 0 && a[4][6] ==0)
							for (n = 0; n < 7; n++)
							{
								//任何一天,必须保证ABCD中至少两人上班
								if (a[0][n] + a[1][n] + a[2][n] + a[3][n] < 2)
									break;
								//一周中,至少有3天所有人都是上班的
								if (a[0][n] == 1 && a[1][n] == 1 && a[2][n] == 1 && a[3][n] == 1 && a[4][n] == 1)
									x++;
								//A C一周中必须至少有四天能见面(同时上班)
								if (a[0][n] == 1 && a[2][n] == 1)
									y++;
							}
						if (x >= 3 && y >= 4)
						{
							for (q = 0; q < 5; q++)
							{
								for (n = 0; n < 7; n++)
									printf("%d", a[q][n]);
								putchar('\n');
							}
							putchar('\n');
						}
					}
				}
			}
		}
	}
	return 0;
}


以下是关于C语言蓝桥杯算法的讲解: 1. 蓝桥杯算法题目类型 蓝桥杯算法题目主要分为以下几类:数学题、递推题、搜索题、贪心题、动态规划题、图论题等。 2. 数学题 数学题是蓝桥杯中出现频率最高的一类题目,主要考察对数学知识的掌握和应用能力。常见的数学题目有:最大公约数、最小公倍数、质数判断、进制转换、列组合等。 3. 递推题 递推题是指通过已知的一些条件,推导出后续的结果。递推题目通常需要使用循环结构来实现。常见的递推题目有:斐波那契数列、汉诺塔、青蛙跳等。 4. 搜索题 搜索题是指在一个状态空间中寻找目标状态的过程。搜索题目通常需要使用递归或循环结构来实现。常见的搜索题目有:深度优先搜索、广度优先搜索、回溯法等。 5. 贪心题 贪心算法是指在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法。贪心题目通常需要使用序等方法来实现。常见的贪心题目有:背包问题、活动安排等。 . 动态规划题 动态规划是一种将复杂问题分解成小问题来解决的优化技术。动态规划题目通常需要使用递推或循环结构来实现。常见的动态规划题目有:最长上升子序列、最大子段和等。 7. 图论题 图论是研究图的性质和图之间关系的数学分支。图论题目通常需要使用图的遍历、最短路径等算法来实现。常见的图论题目有:最短路径、最小生成树等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值