我的标题措辞可能更好。我将从一个普遍的问题开始,解释大局,然后得出确切的问题。
我有一个网络应用程序来举办比赛,我认为很酷的功能之一就是还可以分配参赛者的赛道(因此,不仅可以进行计算并提供用户界面,还可以确定玩家应该在哪个赛道上进行比赛(如果您想想象一条赛道,请想象一下像保龄球馆的小巷)。问题是,如果玩家在上一个游戏或之前的游戏中玩过相同的曲目,则他不能在同一曲目上玩(但如果在下一行,则可以玩)。
当参赛者互相竞争时,我的第一个(也是迄今为止唯一的想法)是遍历每对玩家,检查他们播放的曲目并将其添加到名为playedTracks
的数组中。
让我们说这个功能已经完成,并且正确地返回了一个数组playedTracks
,最大大小为4
(四是两个玩家都玩了至少三轮,而两个都没有玩过)与其他曲目相同):
function getPlayedTracks($resultId,$opponentResultId,$currentRound){
//Returns the list of tracks on which the pair has played on!
$playedTracks = [];
if ($currentRound == 1){
//No tracks to pick from
return [];
}
else if ($currentRound == 2){
//One track to pick from
$oneBehind = 1;
}
else{
//Pick from two tracks
$oneBehind = $currentRound - 1;
$twoBehind = $currentRound - 2;
}
return $playedTracks,
}
现在,我正坐在一个循环中(正如我提到的那样,我要遍历一对球员),我有一对球员和他们在其中进行比赛的赛道。我还有一组要分配的曲目,假设我有编号为1,2,3,4,5
且返回$playedTracks
的{{1}}的曲目。因此,选择是[1,2,3]
。我将选择4 or 5
。随着循环向前循环,将返回更多4
,并且在某些时候可能存在分配曲目的情况,但是在过去的两场比赛中,它们都已经在该曲目上播放了。
我不确定我的方法是否正确,也许我应该考虑逐个玩家而不是一对。有没有人遇到过类似的问题,或者可以在此问题上说出什么有帮助的话?
出于好奇,这是循环部分(是的,我不赞成使用mysql扩展名):
$playedTracks
答案 0 :(得分:0)
下次其他人遇到麻烦时,只需发布答案即可。
曲目列表$listOfTracks = [1,2,3,4,5]
。这些都是曲目。
每对可用的轨道可以添加到一个数组中(索引指的是对):
$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]]
此数组可以可视化为树。具有所有轨道号的第一个组合是一个合适的组合(在上面的示例中,它可以是1,3,5,2,4
或4,3,5,1,2
,具体取决于选择了哪种算法来遍历树。 /两种解决方案,但任务是不只是第一个找到所有解决方案。
要遍历树的一种算法是“选择左侧”,如果可能的话,总是选择最左侧的节点(基于先前的示例$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]]
:
Current node [1,4], Select 1, move downwards - $selectedNumbers = [1]
Current node [3,5], Select 3, move downwards - $selectedNumbers = [1,3]
Current node [2,3,5], Select 2, move downwards - $selectedNumbers = [1,3,2]
Current node [1,2], 1 and 2 are only available nodes, both are used, move upwards and continue with different node.
Current node [2,3,5], 2 wasnt suitable, 3 is not suitable (as already used), Select 5, move downwards - $selectedNumbers = [1,3,5].
Current node [1,2], 1 is not suitable (as already used), Select 2, move downwards - `$selectedNumbers = [1,3,5,2]`
Current node [2,4], 2 is not suitable (as already used), Select 4, array has reached the same length as number of pairs, found suitable.
Final list: `$selectedNumbers = [1,3,5,2,4]`