110,538
社区成员
发帖
与我相关
我的任务
分享
--获取对应数量
Select @ManNum = IsNull(Max(OrderNo),0) From ##ManTable
Select @WomanNum = IsNull(Max(OrderNo),0) From ##WomanTable
Set @Max = Case When @ManNum > @WomanNum Then @ManNum Else @WomanNum End --获取最大的分配值
Set @CircleCount = @Max / (@ClassNum * 2) --初始循环次数
Set @Step = 1
While(@Step <= @CircleCount) --首先分配,不考虑区域限制
Begin
--计算公式:班级OrderNo + (步骤@Step - 1)*班级总数@ClassNum 从首正排序插入班级
Update #ClassTable Set ManNum = a.Num From (Select IsNull(Count(Ksh),0) As Num,CCode From ##ManTable Group By CCode) a,#ClassTable b Where a.CCode = b.CCode
Update ##ManTable Set CCode = a.CCode From #ClassTable a,##ManTable b Where b.OrderNo = a.OrderNo + (@Step - 1) * @ClassNum
And b.CCode = '' And a.ManNum <= @ManNum
Update #ClassTable Set WomanNum = a.Num From (Select IsNull(Count(Ksh),0) As Num,CCode From ##WomanTable Group By CCode) a,#ClassTable b Where a.CCode = b.CCode
Update ##WomanTable Set CCode = a.CCode From #ClassTable a,##WomanTable b,@TempArea c Where b.OrderNo = a.OrderNo + (@Step - 1) * @ClassNum
And b.CCode = '' And a.WomanNum <= @WomanNum
--计算公式:最大男生或者女生@ManNum或@WomanNum - (班级OrderNo + (步骤@Step - 1)*班级总数@ClassNum - 1) 从尾倒排序插入班级
Update #ClassTable Set ManNum = a.Num From (Select IsNull(Count(Ksh),0) As Num,CCode From ##ManTable Group By CCode) a,#ClassTable b Where a.CCode = b.CCode
Update ##ManTable Set CCode = a.CCode From #ClassTable a,##ManTable b Where b.OrderNo = @ManNum - (a.OrderNo + (@Step - 1) * @ClassNum - 1)
And b.CCode = '' And a.ManNum <= @ManNum
Update #ClassTable Set WomanNum = a.Num From (Select IsNull(Count(Ksh),0) As Num,CCode From ##WomanTable Group By CCode) a,#ClassTable b Where a.CCode = b.CCode
Update ##WomanTable Set CCode = a.CCode From #ClassTable a,##WomanTable b Where b.OrderNo = @WomanNum - (a.OrderNo + (@Step - 1) * @ClassNum - 1)
And b.CCode = '' And a.WomanNum <= @WomanNum
Set @Step = @Step + 1
End
/// <summary>
/// 错位
/// </summary>
/// <param name="AllGroup">完成分组步骤的分组</param>
/// <returns>完成错位步骤的分组</returns>
private ArrayList MoveGroup(ArrayList AllGroup)
{
for (int i = 0; i < AllGroup.Count; i++)
{
ArrayList Group = (ArrayList)AllGroup[i];
int MoveIndex = Group.Count / 2;
int MoveCount = i % MoveIndex; //移动次数
for (int j = 0; j < MoveCount; j++)
{
int Move = Convert.ToInt32(Group[MoveIndex - 1]);
Group.RemoveAt(MoveIndex-1);
Group.Insert(0, Move);
Move = Convert.ToInt32(Group[Group.Count - 1]);
Group.RemoveAt(Group.Count - 1);
Group.Insert(MoveIndex, Move);
}
}
return AllGroup;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 分组
/// </summary>
/// <param name="ClassNum">班级数</param>
/// <param name="StudentNum">学生数</param>
/// <returns>完成分组步骤的分组</returns>
private ArrayList DivideGroup(int ClassNum, int StudentNum)
{
//先把所有学生分组
ArrayList AllGroup = new ArrayList(); //存放所有分组
int GroupNum = ClassNum * 2; //每组学生数
int count = StudentNum % GroupNum == 0 ? StudentNum / GroupNum : StudentNum / GroupNum + 1; //组数
//把学生加入分组
for (int i = 1; i < count + 1; i++)
{
ArrayList Group = new ArrayList();
int StartIndex=GroupNum * (i - 1) + 1;
int EndIndex=GroupNum * i + 1;
for (int j = StartIndex; j < EndIndex; j++)
{
Group.Add(j > StudentNum ? 0 : j); //不足就用0代替
}
AllGroup.Add(Group);
}
return AllGroup;
}
/// <summary>
/// 错位
/// </summary>
/// <param name="AllGroup">完成分组步骤的分组</param>
/// <returns>完成错位步骤的分组</returns>
private ArrayList MoveGroup(ArrayList AllGroup)
{
//第一组不错位,所以从第二组开始
for (int i = 1; i < AllGroup.Count; i++)
{
ArrayList Group = (ArrayList)AllGroup[i];
for (int j = 0; j < i; j++) //移动几次
{
int MoveIndex = Group.Count / 2;
int Move = Convert.ToInt32(Group[MoveIndex - 1]);
Group.RemoveAt(MoveIndex-1);
Group.Insert(0, Move);
Move = Convert.ToInt32(Group[Group.Count - 1]);
Group.RemoveAt(Group.Count - 1);
Group.Insert(MoveIndex, Move);
}
}
return AllGroup;
}
/// <summary>
/// 折叠分班
/// </summary>
/// <param name="AllGroup">完成错位步骤的分组</param>
/// <returns></returns>
private Hashtable DivideClass(ArrayList AllGroup)
{
Hashtable htClass=new Hashtable();
for (int i = 0; i < AllGroup.Count; i++)
{
ArrayList Group = (ArrayList)AllGroup[i];
//对于每个分组,第一个和最后一个属于一班,第二个和倒数第二个属于二班.......循环一半即可
int ClassNum=Group.Count / 2;
for (int j = 0; j < ClassNum; j++)
{
ArrayList Class = new ArrayList();
int ClassNo = (j + 1) % ClassNum == 0 ? ClassNum : (j + 1) % ClassNum;
if (htClass[ClassNo] == null)
{
Class.Add(Group[j]);
Class.Add(Group[Group.Count - 1 - j]);
htClass.Add(ClassNo, Class);
}
else
{
Class = (ArrayList)htClass[ClassNo];
Class.Add(Group[j]);
Class.Add(Group[Group.Count - 1 - j]);
}
}
}
return htClass;
}
private void button1_Click(object sender, EventArgs e)
{
Hashtable ht = DivideClass(MoveGroup(DivideGroup(8, 63)));
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 9; i++)
{
ArrayList Class = (ArrayList)ht[i];
sb.Append(i.ToString() + "班:");
for (int j = 0; j < Class.Count; j++)
{
sb.Append(" " + Class[j].ToString());
}
sb.Append("\r\n");
}
this.richTextBox1.Text = sb.ToString();
}
}
}