我有一个包含1-8这8个数字的数组。
arr = [1, 2, 3, 4, 5, 6, 7, 8]
数组中的每个数字都是一个组的一部分。
1 & 2 - group a
3 & 4 - group b
5 & 6 - group c
7 & 8 - group d
我需要做的是将数组中的每个数字与同一组中的另一个数字进行匹配,但它们不能在同一组中。
1和2不能与1或2匹配 3和4不能与3或4匹配 5和6不能与5或6匹配 7和8不能与7或8匹配
要求:
1.可能不是预先确定的,给定相同的输入,必须可能有不同的解决方案。 2.没有重复配对,例如如果2与8配对,4不能再次与8配对。 3.必须一次配对一次,能够留下一些配对未完成,并在以后的日期回来完成更多的配对。 4.配对无法重置或撤消,一旦配对就是永久的。 5.在所有情况下,一个配对不能同时运行。例如,如果2与3配对,则3不能始终与2配对。如果这种情况偶尔发生是可以接受的,但它不能成为一个有意的特性。 6.我们不能假设配对将以任何特定的顺序进行。例如,第一个配对可以由1,也可以由7或3等进行。任何数字都可能需要在任何时候进行配对。
我的问题是,如果你选择恰当的顺序,你会卡在最后一个数字上,唯一剩下的配对就是与自己或它的组员配对。
我想强调一个条件,因为它在回答中一直被忽视。我希望一次只能进行一对配对。这意味着您应该能够将每个配对的间隔时间拉长到任何程度。我想能够在第0天进行配对,然后我可以在第1天,第2周或第2750年回来进行第二次配对。这是必要的。每一对配对都必须完全独立于其他配对,并且在最后,最后一个数字仍然能够进行有效的配对。
例如...
6 with 8
7 with 6
5 with 7
3 with 5
8 with 4
2 with 3
4 with 2
1 with _
这个命令只能使1与自己匹配。
我该怎么做才能让最后一个数字始终有可行的匹配?
更新:我已在答案部分添加了一个相当好的解决方案。如果您仍然难以理解我的目标,请尝试阅读答案部分中的回答。附加的代码已过时,因为我已经找到了一个当前可用的答案。
过时的代码如下。
function selectGiftee(req, res, db){
const {user_id, group_id} = req.body
db.select('name', 'user_id', 'giftee_id', 'group_id').from('users')
.then (data => {
if (data.length) {
// only sending available giftees
const taken = [];
const fullList = [];
let available = [];
// figure out which giftees are taken
data.forEach( user => {
if (user.giftee_id !== null){
taken.push(user.giftee_id)
}
if (user.group_id === group_id) {
taken.push(user.user_id)
}
})
// add all giftees to a list
data.forEach( user => {
fullList.push(user.user_id)
})
// only add available giftees to the available list
available = fullList.filter(val => !taken.includes(val));
// respond with only giftees that are not taken
res.json(available)
?
应该是除了 1 或 2(同一组)之外的所有数字。那么,有没有关于最佳配对(从3,4,5,6,7,8
中选择一个)的规则呢?就我所看到的情况而言,这将与您的第二个条件发生冲突。 - Roko C. Buljan