567
社区成员




#include <ctime>
#include <vector>
#include <fstream>
using namespace std;
#define MAX_NAME_LENGTH 10
#define MAX_FLAG_LENGTH 50
struct TStudent {
char Name[MAX_NAME_LENGTH+1];
char Flag[MAX_FLAG_LENGTH+1];
};
typedef vector<TStudent> TStudents;
void InputDataFromFile(TStudents& Students, int& StudentNumber)
{
char s[MAX_NAME_LENGTH+1+MAX_FLAG_LENGTH+1];
fstream fin;
fin.open("Students.in", ios_base::in);
fin.getline(s, sizeof(s));
StudentNumber = atoi(s);
for (int i=0; i<StudentNumber; ++i) {
fin.getline(s, sizeof(s));
s[MAX_NAME_LENGTH] = 0;
TStudent Student;
strcpy(Student.Name, s);
strcpy(Student.Flag, &s[MAX_NAME_LENGTH+1]);
Students.push_back(Student);
}
}
int Evaluate2Student(const TStudent& Student1, const TStudent& Student2)
{
int Result = 0;
for (int i=0; i<MAX_FLAG_LENGTH; ++i) {
Result += abs(Student1.Flag[i]-Student2.Flag[i]);
}
return Result;
}
double EvaluateStudents(const TStudents& Students, int StudentNumber)
{
double Result = 0;
for (int i=0; i<StudentNumber/2; ++i) {
Result += Evaluate2Student(Students[i*2], Students[i*2+1])/200.0;
}
return Result;
}
int Find(const TStudents& TempStudents, int Index, int& MinTD)
{
int Result;
MinTD = 200;
for (int i=0; i<(int)TempStudents.size(); ++i) {
if (i==Index) {
continue;
}
int TD = Evaluate2Student(TempStudents[i], TempStudents[Index]);
if (TD<MinTD || (TD==MinTD && rand()%2==0)) {
MinTD = TD;
Result = i;
}
}
return Result;
}
void Foo(TStudents& Students, TStudents& TempStudents, int Index)
{
int TD1, TD2;
int n = Find(TempStudents, Index, TD1);
if (TD1==0 || Index==Find(TempStudents, n, TD2) || (TD1==TD2 && rand()%2==0)) {
Students.push_back(TempStudents[Index]);
Students.push_back(TempStudents[n]);
if (Index>n) {
TempStudents.erase(TempStudents.begin()+Index);
TempStudents.erase(TempStudents.begin()+n);
}
else {
TempStudents.erase(TempStudents.begin()+n);
TempStudents.erase(TempStudents.begin()+Index);
}
}
else {
Foo(Students, TempStudents, n);
}
}
void ComputeStudentAssignments(TStudents& Students, int /*StudentNumber*/)
{
TStudents TempStudents = Students;
Students.clear();
srand((unsigned)time(NULL));
while (TempStudents.size()>0) {
Foo(Students, TempStudents, rand()%(int)TempStudents.size());
}
}
void PrintStudentAssignmentToFile(const TStudents& Students, int StudentNumber)
{
fstream fout;
fout.open("Assignments.out", ios_base::out);
fout << StudentNumber << endl;
for (int i=0; i<StudentNumber; ++i) {
fout << Students[i].Name << ends << Students[i].Flag << endl;
}
}
int main(int argc, char* argv[])
{
TStudents Students;
int StudentNumber;
InputDataFromFile(Students, StudentNumber);
double first = EvaluateStudents(Students, StudentNumber);
printf("The initial Disharmony is %.3f\n", first);
time_t start = time(NULL);
ComputeStudentAssignments(Students, StudentNumber);
time_t end = time(NULL);
printf("Time to compute room assignments is %d seconds\n", end-start);
double final = EvaluateStudents(Students, StudentNumber);
printf("Final Disharmony is %.3f\n", final);
PrintStudentAssignmentToFile(Students, StudentNumber);
system("pause");
return 0;
}