c语言程序课程设计保安值班安排系统怎么做?

2025-02-24 02:51:57
推荐回答(2个)
回答1:

某公司有7名保安人员:赵、钱、孙、李、周、吴、陈。由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为合适的休息日。请编制一程序,打印轮休的所有可能方案。当然使每个人都满意,例如每人选择的休息日如下:
赵:星期二、星期四
钱:星期一、星期六
孙:星期三、星期日
李:星期五
周:星期一、星期四、星期六
吴:星期二、星期五
陈:星期三、星期六、星期日

解法一:#include "stdafx.h"
#include

using namespace std;

static char * day[] =
{
"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
};

int _tmain(int argc, _TCHAR* argv[])
{
int a, b, c, d, e, f, g, s;

d = 4;
f = 1;
s = 0;
for( a = 0; a < 7; a++ )
{
if( (a !=1 && a != 3) || a == d || a == f )
continue;

for( b = 0; b < 7; b++ )
{
if( (b != 0 && b != 5) || b == a || b == d || b == f )
continue;

for( c = 0; c < 7; c++ )
{
if( (c != 2 && c != 6) || c == b || c == a || c == d || c == f )
continue;
for( e = 0; e < 7; e++ )
{
if( (e != 0 && e != 3 && e != 5) || e == d || e == c || e == b || e == a || e == f)
continue;
for( g = 0; g < 7; g++ )
{
if( (g != 2 && g != 5 && g != 6) || g == f || g == e || g == d || g == c || g == b || g == a )
continue;
++s;
cout << "Solution: " << s << endl;
cout << "赵\t钱\t孙\t李\t周\t吴\t陈" << endl;
cout << "==============================================================" << endl;
cout << day[a] << "\t" << day[b] << "\t" << day[c] << "\t" << day[d] << "\t"
<< day[e] << "\t" << day[f] << "\t" << day[g] << endl << endl;
}
}
}
}
}
}

运行结果:
Solution: 1
赵 钱 孙 李 周 吴 陈
==============================================================
星期四 星期一 星期三 星期五 星期六 星期二 星期日

Solution: 2
赵 钱 孙 李 周 吴 陈
==============================================================
星期四 星期一 星期日 星期五 星期六 星期二 星期三

Solution: 3
赵 钱 孙 李 周 吴 陈
==============================================================
星期四 星期六 星期三 星期五 星期一 星期二 星期日

Solution: 4
赵 钱 孙 李 周 吴 陈
==============================================================
星期四 星期六 星期日 星期五 星期一 星期二 星期三

解法二:#include
char *WEEK[7] = {" 7.", " 1.", " 2.", " 3.", " 4.", " 5.", " 6."};

int IsChecked(int p[])
{
int i, j;
for (i=0; i<7; ++i)
{
for (j=0; j<7&&p[j]!=i; ++j); //*从0到6循环,如果数组中缺少0-6的任何一位数字,则返回0,如果0-6亿权,则返回。*//
if (j == 7) return 0;
}
return 1; //*这个函数的作用是确保0-6这7个数字均包含在该书组中*//
}

main()
{
int t=0, j, ren[7];
long i;
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("**********************************************");
printf("\n*zhao, qian, sun, li, zhou, wu, chen *\n");
printf("*--------------------------------------------*\n");
printf("");
for (i=0; i<2097152; ++i)
{
for (j=0; j<7; ++j)

{
ren[j]= (i>>(3*j))&7; //*通过这个循环,穷尽0-7在数组中所有的排列组合方式*//
}
if (!(ren[0]==2 || ren[0]==4))continue; //*如果赵保安不是休周二或周四,就不用循环了。*//
else if (!(ren[1]==1 || ren[1]==6))continue;//*如果钱保安不是休周一或周六,就不用循环了。*//
else if (!(ren[2]==3 || ren[2]==0))continue;//*如果孙保安不是休周三或周日,就不用循环了。*//
else if (!(ren[3]==5))continue; //*如果李保安不是休周五,就不用循环了。*//
else if (!(ren[4]==1 || ren[4]==4 || ren[4]==6))continue; //*如果周保安不是休周一或周四或周六,就不用循环了。*//
else if (!(ren[5]==2 || ren[5]==5))continue; //*如果吴保安不是休周二或周五,就不用循环了。*//
else if (!(ren[6]==3 || ren[6]==6 || ren[6]==0))continue;//*如果陈保安不是休周三或周六或周日,就不用循环了。*//
else if (!IsChecked(ren)) continue; //*至此,所有的保安可按他们的愿望休假,但是此时的方案可能有两个人同休一天的*//
//*情况发生,因此用这个函数排除,如果0-6这七个数字(一周七天)任何一个包含在数组中则此次匹配失败。*//
for (j=0; j<7; ++j){
printf(" %s ", WEEK[ren[j]]);
}printf(" *");
printf("\n"); //*输出成功匹配方案*//
++t; //*记录成功匹配个数*//
}
printf("*--------------------------------------------*");
printf("\n* %d zhong qing kuang! *", t); //*输出成功匹配方案个数*//
printf("\n**********************************************");
getch();
}

结果是
**********************************************
*zhao, qian, sun, li, zhou, wu, chen *
*--------------------------------------------*
4. 6. 3. 5. 1. 2. 7. *
4. 1. 3. 5. 6. 2. 7. *
4. 6. 7. 5. 1. 2. 3. *
4. 1. 7. 5. 6. 2. 3. *
*--------------------------------------------*
* 4 zhong qing kuang! *

回答2:

把题目具体说清楚点好吧兄弟。。。。。