如何解决为每周约会配对 我的尝试编辑
我正在尝试制作一个程序来创建成对的人,以便每周进行一对一的聊天。一个人不会与他们之前配对的人配对(例如,第 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 举报,一经查实,本站将立刻删除。