#include <stdio.h>
#include <string.h>

char *week[7] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
char *names[7] = { "钱", "赵", "孙", "李", "周", "吴", "陈" };
int plan[7] = { -1 };				/*保存每天安排休息的保安序号*/
int planNum = 0;				/*轮休安排的方案数*/
int len[7];						/*保存每个保安选择的休息日个数*/
int rest[7][7];					/*保存每个保安选择的休息日*/

void menu()
{
	printf("\t**************欢迎进入保安轮休安排系统**************\n");
    printf("\t*                                                  *\n");
    printf("\t*                  1:选择休息日                    *\n");
    printf("\t*                  2:打印轮休表                    *\n");
    printf("\t*                  3:退出                          *\n");
    printf("\t*                                                  *\n");
    printf("\t****************************************************\n");
	printf("请选择相应功能：\n");
}

void input()
{
    int i=0, j=0;
	char temp[30];						/*存储输入的预选休息日*/
	char* day;
	printf("请输入每个保安希望的休息日(星期一~星期日，多个休息日用、隔开):\n");
   	while(i<7)
    {
        printf("%s：", names[i] );
        len[i] = 0;
        scanf("%s", temp);			/*输入的预选休息日*/
        day = strtok(temp, "、");	/*使用strtok函数将输入的多个休息日分隔开*/
        while( day != NULL)
        {
            for(j=0;j<7;j++)
            {
                if(!strcmp(day, week[j]))
                {
                    rest[i][len[i]] = j;
                    break;
                }
            }
            day = strtok(NULL, "、");
            len[i]++;					/*统计预选休息日的个数*/
        }
        i++;
    }
}

void doPlan(int n, int*len, int rest[7][7]) 
{
	int i;
    if (n > 6) 
	{
        planNum++;					/*每找到一种轮休方案，planNum加1*/
        for (i = 0; i < n; ++i) 
			printf(" %s\t", names[plan[i]]);	/*输出星期i休息的保安名字*/
        printf("\n");
    } 
	else
	{
        for (i = 0; i < len[n]; ++i) 
		{
            if (plan[rest[n][i]] >= 0) 		
			{
                continue;
            }
        plan[rest[n][i]] = n;		/*根据数组rest安排n号保安的休息日*/
	    doPlan(n+1, len, rest); 	/*递归调用doPlan( )，安排n+1号保安的休息日*/
        plan[rest[n][i]] = -1;	/*重置plan数组元素值，以便制定下一种安排方案*/
        }
    }
}

void print()
{
    int i;
	printf("轮休安排表如下：\n");
    for (i = 0; i < 7; i++) 
	{
        printf("%s\t", week[i]);		/*输出星期一~星期日*/
        plan[i] = -1;
    }
    printf("\n");
	planNum = 0;
    doPlan(0, len, rest);			/*调用doPlan( )制定轮休安排*/
    printf("总共有 %d 个轮休安排方案\n",planNum);
}

int main()
{
    int menu_choice;
	menu();							/*显示系统功能菜单*/
   	scanf("%d", &menu_choice);		/*选择功能*/
	while(menu_choice<1||menu_choice>3) 
    {
		printf("您输入有误，重新选择功能：\n");
		scanf("%d",&menu_choice);
     }
    while(menu_choice != 3)
    {
        switch(menu_choice)
        {
            case 1: input();			/*调用input( )，输入预先休息日*/
				  getch();
                  break;
            case 2: print();			/*调用print( )，输出轮休安排表*/
				  getch();
                  break;
        }
        menu();
        scanf("%d", &menu_choice);
    }
    return 0;
}

