为每周约会配对 我的尝试编辑

问题描述

我正在尝试制作一个程序来创建成对的人,以便每周进行一对一的聊天。一个人不会与他们之前配对的人配对(例如,第 1 周中的 [A,B],因此第 2 周中不会再次出现 [A,B] 或 [B,A]),没有重复项(例如,[A,B] 与 [B,A] 相同),并且一个人不能在一个星期内成为两对(例如,[A,B] 在第 1 周见面,所以 [A,C ] 不能在第 1 周见面,因为 A 已经是一对了)。

它接收一个字符串数组,并将每个人与数组中的其他人配对。我还有一个日期数组,其中的数字从 1 到 n。您可以想象元素 1 是第 1 周,元素 2 是第 2 周,依此类推。

例如:


Input: string[] people = ["John","David","Mary","Susan"] and int[] dates = [1,2,3]

Output: [(Week 1,"John","David"),(Week 1,"Susan"),(Week 2,"Mary"),(Week 3,"Mary")]

输出的格式无关紧要,它可以是元组数组、列表数组等。它只需要以某种方式传达周和对。

我的尝试

我是 C# 新手,我一直在尝试使用 Linq/morelinq 和 HashSets 来解决这个问题,但无济于事。我用这个创建了所有不同的组合:

var x = people
            .SelectMany(g => people
            .Select(c => new Tuple<string,string> (g,c)))
            .Where(x => x.Item1 != x.Item2).ToList() // To remove pairs where a person matches with itself
            .SelectMany(g => dates
            .Select(c => new Tuple<string,string,int>(g.Item1,g.Item2,c)))
            .OrderBy(x => x.Item3)
            .ToList();

然后尝试使用 HashSet 过滤掉无效的那些。元组包含(Item1 = person1,Item2 = person2,Item3 = date)。

HashSet<Tuple<string,string>> prevIoUslySelected = new HashSet<Tuple<string,string>>();
List<Tuple<string,int>> RemoveList2 = new List<Tuple<string,int>>(x);

foreach(var item in RemoveList2)
{
   if(prevIoUslySelected.Contains(new Tuple<string,string>(item.Item1,item.Item2)) // Remove duplicates
   || prevIoUslySelected.Contains(new Tuple<string,string>(item.Item2,item.Item1)) // Remove the inverse
   || prevIoUslySelected.Contains(new Tuple<string,item.Item3.ToString())) // Remove the rest of the pairs that have people that are already paired up for that week
   || prevIoUslySelected.Contains(new Tuple<string,item.Item3.ToString())))
   {
      x.Remove(item);
   } else
     {
       prevIoUslySelected.Add(new Tuple<string,item.Item2));
       prevIoUslySelected.Add(new Tuple<string,item.Item3.ToString()));
       prevIoUslySelected.Add(new Tuple<string,item.Item3.ToString()));
      }
   }

是的,这可能是一种非常迂回的方法,但我不知道如何去做,而且这个实现也不起作用。我得到:

(John,Jack,1)
(David,Jesse,1)
(Mary,Sally,1)
(Lisa,Kevin,1)
(Sue,Hansel,1)
(Jen,Rachel,1)

(John,David,2)
(Jack,2)
(Mary,Lisa,2)
(Sally,2)
(Sue,Jen,2)
(Hansel,2)

(John,3)
(Jack,3)
(Mary,3)
(Sally,3)
(Sue,3)
(Hansel,3)

(John,Mary,4)
(Jack,4)
(David,4)
(Jesse,4)

一切似乎都很好,直到我们进入第 4 周。我们每周应该看到 6 对(我的阵列有 12 个人)。做了一些挖掘,它似乎卡住了,因为剩余的对无效并被删除了。

感谢任何帮助。

编辑

我让我的生活变得更加艰难。我只是用了循环算法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...