JPHD-2021-backend/Utils/Arranger.cs

113 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using _2021_backend.Data;
using _2021_backend.Models;
using System.IO;
using System.Threading.Tasks;
namespace _2021_backend.Utils
{
public class Arranger
{
static BackendContext Context;
static List<Student> students;
static List<Session> sessions;
public static bool Arrange(BackendContext context)
{
Context = context;
students = context.Students.Where(it => it.Status == status.).OrderBy(it => it.Timelist.Count).ToList();
sessions = context.Sessions.OrderBy(it => it.Day).ThenByDescending(it => it.Capacity - it.Students.Count).ThenBy(it => it.BeginTime).ThenBy(it => it.Place).ToList();
students.Sort((Student a, Student b) =>
{
var capa = 0;
var capb = 0;
foreach (var tm in a.Timelist)
{
var t = sessions.Find(x => x.Id == tm);
capa += t.Capacity - t.Students.Count;
}
foreach (var tm in b.Timelist)
{
var t = sessions.Find(x => x.Id == tm);
capb += t.Capacity - t.Students.Count;
}
return capa - capb;
});
#if DEBUG
var str = "";
foreach(var st in students)
{
var cap = 0;
var tmstr = "";
foreach (var tm in st.Timelist)
{
var t = sessions.Find(x => x.Id == tm);
cap += t.Capacity - t.Students.Count;
tmstr += t.Day.ToString("dd") + "-" + t.BeginTime.ToString("HH:mm-") + t.Place + " ";
}
str += st.Name + "\t" + st.Timelist.Count.ToString() + "\t" + cap.ToString() + "\t"+ tmstr+ "\n";
}
File.WriteAllText("./students.txt", str);
#endif
var res = DFS(0);
context.SaveChanges();
return res;
}
static bool DFS(int m)
{
if (m >= students.Count) return true;
var lst = students[m].Timelist;
var stu = students[m];
if (stu.Timelist.Contains(stu.InterviewTime) || stu.Timelist.Count() == 0 || stu.InterviewTime != 0 || stu.Status != status.)
{
return m >= students.Count - 1 ? true : DFS(m + 1);
}
else
{
var tm = Context.Sessions.Find(stu.InterviewTime);
if (tm != null)
{
tm.Students.RemoveAll(it => it == stu.Id);
}
stu.InterviewTime = 0;
}
bool depth = false;
foreach (var i in lst)
{
var tm = sessions.Find(s => s.Id == i);
if (tm.Students.Count < tm.Capacity && tm.Day.CompareTo(DateTime.Now.AddHours(-14)) > 0)
{
status prev = students[m].Status;
int prevs = students[m].InterviewTime;
students[m].Status = status.;
students[m].InterviewTime = tm.Id;
tm.Students.Add(students[m].Id);
if (m == students.Count - 1)
{
return true;
}
else
{
depth = true;
if (!DFS(m + 1))
{
students[m].Status = prev;
students[m].InterviewTime = prevs;
tm.Students.Remove(students[m].Id);
continue;
}
else return true;
}
}
}
if (!depth) Console.WriteLine("Unable to find an arrangement. Stack trace:");
Console.WriteLine(stu.Name + " " + stu.Stuid);
return false;
}
}
}