#define NUM 26
#define DOCTOR_INIT -100
#define OBJECT_INIT -100
#define OFFSET_INIT -100
typedef struct Statement /*用来存储每一个语句object1存储第一个字母,2存储第二个,offset存储最后的数字*/
{
int object1
int object2
int offset
}
void manage(struct Statement* statement,int* doctor,int n,int equal)
/*递归函数,处理刚才的输入*/
/*前三个参数是传递当前情况,第四个参数表示刚刚确定的那个doctor[],整次递归只处理刚刚确定的那一个*/
{
int i
for(i=0i<ni++)
{
if(statement[i].object1==equal &&doctor[statement[i].object2]==DOCTOR_INIT &&statement[i].offset!=OFFSET_INIT)
{
doctor[statement[i].object2] = doctor[equal]+statement[i].offset
manage(statement,doctor,n,statement[i].object2)
}
if(statement[i].object2==equal &&doctor[statement[i].object1]==DOCTOR_INIT &&statement[i].offset!=OFFSET_INIT)
{
doctor[statement[i].object1] = doctor[equal]-statement[i].offset
manage(statement,doctor,n,statement[i].object1)
}
}
}
void main()
{
/*变量声明*/
int n
struct Statement statement[NUM]
int doctor[NUM]
int i,k,l
char c[5]
char oper
/*变量初始化*/
for(i=0i<NUMi++)
{
statement[i].object1=OBJECT_INIT
statement[i].object2=OBJECT_INIT
statement[i].offset=OFFSET_INIT
doctor[i]=DOCTOR_INIT
}
/*读入语句*/
printf("请输入n:")
scanf("%d",&n)
for(i=0i<ni++)
{
printf("%d:",i+1)
scanf("%s",c)
statement[i].object1=c[0]-'A'
oper=c[1]
if(oper != '=')
{
statement[i].object2=c[2]-'A'
statement[i].offset=c[3]-'0'
}
else
statement[i].offset=c[2]-'0'
if(oper == '<')
statement[i].offset*=-1
}
/*递归处理语句*/
for(i=0i<ni++)
{
if(statement[i].object2==OBJECT_INIT &&doctor[statement[i].object1]==DOCTOR_INIT)
{
doctor[statement[i].object1]=statement[i].offset
manage(statement,doctor,n,statement[i].object1)
}
}
/*输出*/
for(k=0k<nk++)
{
l=OBJECT_INIT
for(i=0i<ni++)
if(doctor[i]!=DOCTOR_INIT)
if(l==OBJECT_INIT || doctor[l]>doctor[i])
l=i
if(l==OBJECT_INIT)
break
printf("%c ",l+'A')
doctor[l]=DOCTOR_INIT
}
}
编译运行效果:
E:\>gcc 11.c
11.c:12: warning: useless storage class specifier in empty declaration
E:\>a.exe
请输入n:7
1:A<C1
2:D<E1
3:E>B2
4:B>G4
5:F<B1
6:F>C1
7:F=4
E D B F C A G
E:\>
写了我将近一个小时,程序没有问题,需要修改或者有什么问题可以留言。
给你个c++版本做参考:#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
int main(int argc,char *argv[])
{
std::vector<int>arr[7]
std::vector<std::vector<int>>resolution
for(int i=0i!=7++i)
{
int temp
std::cout<<"please input number "<<i+1
<<" person's all rest days he wanted(1-7):\n"
while(std::cin.peek()!='\n')
{
std::cin>>temp
arr[i].push_back(temp)
}
::getchar()
}
int arr1[]={1,2,3,4,5,6,7}
do
{
for(int i=0i!=7++i)
{
std::vector<int>::iterator iter=
std::find(arr[i].begin(),arr[i].end(),arr1[i])
if(iter==arr[i].end())
{
break
}
if(i==6)
{
std::vector<int>temp(arr1,arr1+7)
resolution.push_back(temp)
}
}
}while(std::next_permutation(arr1,arr1+7))
size_t cnt=resolution.size()
std::cout<<"可用的方案如下,按职员A-G的休息日排列:\n"
for(int i=0i!=cnt++i)
{
size_t temp=resolution[i].size()
std::cout<<"方案 "<<i+1<<":\n"
for(int j=0j!=temp++j)
std::cout<<resolution[i][j]<<" "
std::cout<<"\n"
}
::system("pause")
return 0
}
题目5:排班系统
学校实验楼有7名保安人员:钱、赵、孙、李、周、吴、陈。由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为合适的休息日。请编制程序,打印轮休的所有可能方案。当然使每个人都满意,例如每人选择的休息日如下:
钱:星期一、星期六赵:星期二、星期四孙:星期三、星期日李:星期五
周:星期一、星期四、星期六吴:星期二、星期五
陈:星期三、星期六、星期日
运行结果:
功能要求:
1、排班情况需要保存到文件
2、能读取到已经完成的本周排班情况,并进行修改或删除,修改完毕,需要保存至文件。
3、文件中要保存最近四周的排班信息,前三周的只能查看,本周的排班情况可以修改。
4、输入保安人员的名字,查询最近四周工作哪些天,休息那几天。
链接: https://pan.baidu.com/s/1LxVgi4xUnR4NuZo_KeGeoA
提取码:1111
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)