#include〈vector>
#include
#include〈random〉
#include〈iomanip〉
usingnamespacestd;
//原始数据文件中的每一行数据的数据结构
structschedule{
stringgrade_special;//年级专业
stringcourse;//课程名称
stringteacher;//任课教师
stringtotal_hour;//总学时
stringteach_hour;//讲课学时
stringexperiment_hour;//实验学时
stringpractice_hour;//课程实践学时
stringcredit;//学分
stringweek_hour;//周学时
stringstart_stop;//起止周
stringspeciality_orientation;//专业方向
stringperson_num;//人数
};
//排课任务的数据结构
structarrange{
arrange(stringgs,stringc,stringt,intct=—1):
grade_special(gs),course(c),teacher(t),classroom_time(ct){}
stringgrade_special;//年级专业
stringcourse;//课程名称
stringteacher;//任课教师
//stringclassroom;//上课地点
//stringtime;//上课时间
intclassroom_time;//上课地点、时间
};
//教师倒排表数据结构,通过教师姓名找到该教师的排课情况
structteacher_inverted{
teacher_inverted(stringtea,intcl=-1,intar=-1):
teacher(tea),class_loc(cl),arrange_loc(ar){}
stringteacher;
intclass_loc;
intarrange_loc;
};
//教室倒排表数据结构,通过教室名称查找该教室的排课情况
structclassroom_inverted{
classroom_inverted(stringcr,intcl=-1,intar=—1):
classroom(cr),class_loc(cl),arrange_loc(ar){}
stringclassroom;
intclass_loc;
intarrange_loc;
};
intmain(intargc,char**argv){
if(argc!
=3){
cout〈〈”程序调用格式错误!
\n调用格式:
csp排课计划文件可用教室文件\n”;
return0;
}
ifstreaminfile(argv[1]);
vector〈schedule〉plan;
strings;
getline(infile,s);
while(getline(infile,s)){
schedulesch;
istringstreamrecord(s);
record>〉sch。
grade_special〉〉sch.course〉>sch。
teacher〉〉sch.total_hour>>sch。
teach_hour
〉〉sch.experiment_hour>>sch。
practice_hour>〉sch.credit>〉sch.week_hour〉〉sch.start_stop
>〉sch.speciality_orientation〉〉sch.person_num;
plan。
push_back(sch);
}
infile。
close();
vectorvector〈arrange〉arr;//一个班的排课安排
stringgs(””);//教学班级
for(autoit=plan。
begin();it!
=plan。
end();++it){
if(gs!
=it—〉grade_special){
if(!
arr。
empty()){
arranges。
push_back(arr);//教学计划按教学班级顺序排列
arr.clear();
}
gs=it-〉grade_special;
}
arr。
push_back(arrange(it—>grade_special,it->course,it-〉teacher));
}
arranges。
push_back(arr);
vector〈vector〉teachers;//教师数组
for(unsignedi=0;isize();++i){
for(unsignedj=0;jstringtea=arranges[i][j].teacher;
if(tea==”未定”)continue;
unsignedk=0;
for(;ksize();++k){
if(teachers[k][0]。
teacher==tea){
teachers[k]。
push_back(teacher_inverted(tea,i,j));
break;
}
}
if(k==teachers。
size()){
vector〈teacher_inverted〉ti;//一个教师的排课信息倒排表
ti。
push_back(teacher_inverted(tea,i,j));
teachers。
push_back(ti);
}
}
}
constintN=256;
bitsetct;//教室时段的分配状况
infile。
open(argv[2]);;
vector〈string>classrooms;//教室数组
while(getline(infile,s)){
classrooms.push_back(s);
}
infile.close();
unsignedarrange_num=plan。
size();//待排课数目
unsignedclass_num=arranges。
size();//教学班级数目
unsignedclassroom_num=classrooms。
size();//教室数目
uniform_int_distributiondefault_random_enginee(time(0));
vectorclass_loc(class_num,0);//教学班级已分配状况
unsignedclass_cur=0;//待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课
for(unsignedn=0;n〈arrange_num;++n){
unsignedk=u(e);
//如果某个班级的排课任务已经分配完成,则选择下一个班级继续排课
while(class_loc[class_cur]==arranges[class_cur].size()){
class_cur=(class_cur+1)%class_num;
}
//找到待排课任务的对应教师
stringtea=arranges[class_cur][class_loc[class_cur]].teacher;
unsignedi=0;
for(;i〈teachers.size();++i){
if(tea==teachers[i][0].teacher)break;
}
//找出与该教师无时间冲突的时段
do{
do{
while(ct.test(k)){k=(k+1)%(classroom_num*20);}
unsignedm=0;
for(;m〈class_loc[class_cur];++m){
if(arranges[class_cur][m]。
classroom_time%20==k%20)break;
}
if(m==class_loc[class_cur])break;//如果与前面已安排的该班级时间无冲突,则k可用
k=(k+1)%(classroom_num*20);//如果有冲突则检查下一个教室时段是否可用
}while
(1);
if(i==teachers.size())break;//教师未定
unsignedj=0;
for(;jsize();++j){
intm=arranges[teachers[i][j]。
class_loc][teachers[i][j].arrange_loc]。
classroom_time;
if(m!
=-1&&(m%20==k%20))break;
}
if(j==teachers[i].size())break;//如果与该教师的时间无冲突,则k可用
k=(k+1)%(classroom_num*20);//如果有冲突则检查下一个教室时段是否可用
}while
(1);
//排课
arranges[class_cur][class_loc[class_cur]].classroom_time=k;
ct.set(k);
//将当前班级的排课号+1
++class_loc[class_cur];
//将待排课班级号+1
class_cur=(class_cur+1)%class_num;
}
loop:
//输出
cout〈〈”\t\t高校自动排课系统\n";
cout<〈"选择查询条件:
1.按班级2。
按教师3。
按教室\n";
cout<〈"请输入查询序号:
(输入-1退出系统)";
unsignedchoice=0;
cin>〉choice;
if(-1==choice){
cout<〈"正常退出系统\n";
return0;
}
elseif(1==choice){
unsignedi=0,j=0;
for(;i〈arranges。
size();++i){
cout〈
if((i+1)%4==0)cout<〈"\n";
}
cout<<"\n”;
do{
cout〈〈"\n请输入待查询班级的序号:
(输入-1结束查询)”;
cin〉〉i;
if(i==—1){
break;
}
elseif(i〉=arranges。
size()){
cout<〈”非法选择\n";
continue;
}
intclass_table[4][5];
for(unsignedm=0;m<4;++m)
for(unsignedn=0;n<5;++n)
class_table[m][n]=—1;
for(j=0;j〈arranges[i].size();++j){
unsignedm=arranges[i][j].classroom_time%20;
class_table[m/5][m%5]=j;
}
stringtime_slot[4]={"8:
00-9:
40”,”10:
00—11:
40”,"14:
00-15:
40","16:
00—17:
40”};
cout<:
left);
cout<grade_special<<”班级课程表\n";
cout〈〈”====================================================================================================================================\n”;
cout<for(unsignedm=0;m〈4;++m){
if(m%2==0)
cout〈〈”====================================================================================================================================\n";
else
cout〈〈”-——-——-—------—--—--—-——-———-—-———------——-—-——-—-—-————-——---——-——---——-----—-——--—-——----—--————————--——-—--——---—---—-———--——-———\n";
for(unsignedm1=0;m1〈3;++m1){
if(m1==1)
cout<else
cout〈for(unsignedn=0;n〈5;++n){
if(class_table[m][n]!
=-1){
j=class_table[m][n];
if(m1==0)
cout〈〈setw(24)<〈arranges[i][j]。
course;
elseif(m1==1)
cout<classroom_time/20];
else
cout〈teacher;
}
else
cout〈}
cout<〈”\n";
}
}
cout〈<"====================================================================================================================================\n";
cout〈:
left);
}while
(1);
}
elseif(2==choice){
unsignedi=0,j=0;
for(;isize();++i){
cout〈
if((i+1)%4==0)cout〈<"\n";
}
cout<〈”\n";
do{
cout<〈”\n请输入待查询教师的序号:
(输入-1结束查询)”;
cin〉>i;
if(i==—1){
break;
}
elseif(i>=teachers。
size()){
cout<〈”非法选择\n";
continue;
}
intclass_table[4][5];
for(unsignedm=0;m〈4;++m)
for(unsignedn=0;n<5;++n)
class_table[m][n]=—1;
for(j=0;j〈teachers[i].size();++j){
unsignedm=arranges[teachers[i][j].class_loc][teachers[i][j]。
arrange_loc]。
classroom_time/20;
class_table[m/5][m%5]=j;
}
stringtime_slot[4]={”8:
00-9:
40”,"10:
00-11:
40”,”14:
00-15:
40",”16:
00-17:
40"};
cout〈:
left);
cout<〈setw(54)〈<""<〈teachers[i][0]。
teacher<〈"老师课程表\n”;
cout<〈"====================================================================================================================================\n";
cout〈for(unsignedm=0;m<4;++m){
if(m%2==0)
cout<〈”====================================================================================================================================\n”;
else
cout<〈"————-——---———-————-—--—--—----———--————--——---—-———--——-—-——----———-——--——-———-————----——-—-—-——-—--———---——————----———-—-———--——-—-\n";
for(unsignedm1=0;m1<3;++m1){
if(m1==1)
cout<else
cout〈for(unsignedn=0;n〈5;++n){
if(class_table[m][n]!
=-1){
j=class_table[m][n];
if(m1==0)
cout<〈setw(24)<〈arranges[teachers[i][j]。
class_loc][teachers[i][j].arrange_loc].course;
elseif(m1==1)
cout〈〈setw(24)<〈classrooms[arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc]。
classroom_time/20];
else
cout<